summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-29 04:21:29 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-29 04:21:29 +0000
commit683f1f3ddde13390781318b9fe4a6841ea35d145 (patch)
treec21fddf99f2e5233bb3f22bbafd0d711fe7c5d95
parentInitial commit. (diff)
downloadpython-tomli-683f1f3ddde13390781318b9fe4a6841ea35d145.tar.xz
python-tomli-683f1f3ddde13390781318b9fe4a6841ea35d145.zip
Adding upstream version 2.0.1.upstream/2.0.1upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
-rw-r--r--.bumpversion.cfg13
-rw-r--r--.flake86
-rw-r--r--.github/workflows/tests.yaml90
-rw-r--r--.gitignore135
-rw-r--r--.pre-commit-config.yaml58
-rw-r--r--CHANGELOG.md161
-rw-r--r--LICENSE21
-rw-r--r--LICENSE-HEADER3
-rw-r--r--README.md181
-rw-r--r--benchmark/LICENSE17
-rw-r--r--benchmark/README.md22
-rw-r--r--benchmark/data.toml128
-rw-r--r--benchmark/requirements.txt9
-rw-r--r--benchmark/run.py64
-rw-r--r--fuzzer/fuzz.py79
-rw-r--r--fuzzer/requirements.txt4
-rw-r--r--profiler/requirements.txt1
-rw-r--r--profiler/test_for_profiler.py24
-rw-r--r--pyproject.toml157
-rw-r--r--src/tomli/__init__.py11
-rw-r--r--src/tomli/_parser.py691
-rw-r--r--src/tomli/_re.py107
-rw-r--r--src/tomli/_types.py10
-rw-r--r--src/tomli/py.typed1
-rw-r--r--tests/__init__.py9
-rw-r--r--tests/burntsushi.py120
-rw-r--r--tests/data/invalid/array-missing-comma.toml1
-rw-r--r--tests/data/invalid/array-of-tables/overwrite-array-in-parent.toml4
-rw-r--r--tests/data/invalid/array-of-tables/overwrite-bool-with-aot.toml2
-rw-r--r--tests/data/invalid/array/file-end-after-val.toml1
-rw-r--r--tests/data/invalid/array/unclosed-after-item.toml1
-rw-r--r--tests/data/invalid/array/unclosed-empty.toml1
-rw-r--r--tests/data/invalid/basic-str-ends-in-escape.toml1
-rw-r--r--tests/data/invalid/boolean/invalid-false-casing.toml1
-rw-r--r--tests/data/invalid/boolean/invalid-true-casing.toml1
-rw-r--r--tests/data/invalid/burntsushi/COPYING21
-rw-r--r--tests/data/invalid/burntsushi/invalid/array/missing-separator.toml1
-rw-r--r--tests/data/invalid/burntsushi/invalid/array/no-close-2.toml1
-rw-r--r--tests/data/invalid/burntsushi/invalid/array/no-close-table-2.toml1
-rw-r--r--tests/data/invalid/burntsushi/invalid/array/no-close-table.toml1
-rw-r--r--tests/data/invalid/burntsushi/invalid/array/no-close.toml1
-rw-r--r--tests/data/invalid/burntsushi/invalid/array/tables-1.toml4
-rw-r--r--tests/data/invalid/burntsushi/invalid/array/tables-2.toml10
-rw-r--r--tests/data/invalid/burntsushi/invalid/array/text-after-array-entries.toml4
-rw-r--r--tests/data/invalid/burntsushi/invalid/array/text-before-array-separator.toml4
-rw-r--r--tests/data/invalid/burntsushi/invalid/array/text-in-array.toml5
-rw-r--r--tests/data/invalid/burntsushi/invalid/bool/mixed-case.toml1
-rw-r--r--tests/data/invalid/burntsushi/invalid/bool/wrong-case-false.toml1
-rw-r--r--tests/data/invalid/burntsushi/invalid/bool/wrong-case-true.toml1
-rw-r--r--tests/data/invalid/burntsushi/invalid/control/bare-null.tomlbin0 -> 27 bytes
-rw-r--r--tests/data/invalid/burntsushi/invalid/control/comment-cr.toml1
-rw-r--r--tests/data/invalid/burntsushi/invalid/control/comment-del.toml1
-rw-r--r--tests/data/invalid/burntsushi/invalid/control/comment-lf.toml1
-rw-r--r--tests/data/invalid/burntsushi/invalid/control/comment-null.tomlbin0 -> 26 bytes
-rw-r--r--tests/data/invalid/burntsushi/invalid/control/comment-us.toml1
-rw-r--r--tests/data/invalid/burntsushi/invalid/control/control.multibin0 -> 645 bytes
-rw-r--r--tests/data/invalid/burntsushi/invalid/control/multi-del.toml1
-rw-r--r--tests/data/invalid/burntsushi/invalid/control/multi-lf.toml1
-rw-r--r--tests/data/invalid/burntsushi/invalid/control/multi-null.tomlbin0 -> 25 bytes
-rw-r--r--tests/data/invalid/burntsushi/invalid/control/multi-us.toml1
-rw-r--r--tests/data/invalid/burntsushi/invalid/control/rawmulti-del.toml1
-rw-r--r--tests/data/invalid/burntsushi/invalid/control/rawmulti-lf.toml1
-rw-r--r--tests/data/invalid/burntsushi/invalid/control/rawmulti-null.tomlbin0 -> 28 bytes
-rw-r--r--tests/data/invalid/burntsushi/invalid/control/rawmulti-us.toml1
-rw-r--r--tests/data/invalid/burntsushi/invalid/control/rawstring-del.toml1
-rw-r--r--tests/data/invalid/burntsushi/invalid/control/rawstring-lf.toml1
-rw-r--r--tests/data/invalid/burntsushi/invalid/control/rawstring-null.tomlbin0 -> 25 bytes
-rw-r--r--tests/data/invalid/burntsushi/invalid/control/rawstring-us.toml1
-rw-r--r--tests/data/invalid/burntsushi/invalid/control/string-bs.toml1
-rw-r--r--tests/data/invalid/burntsushi/invalid/control/string-del.toml1
-rw-r--r--tests/data/invalid/burntsushi/invalid/control/string-lf.toml1
-rw-r--r--tests/data/invalid/burntsushi/invalid/control/string-null.tomlbin0 -> 22 bytes
-rw-r--r--tests/data/invalid/burntsushi/invalid/control/string-us.toml1
-rw-r--r--tests/data/invalid/burntsushi/invalid/datetime/hour-over.toml2
-rw-r--r--tests/data/invalid/burntsushi/invalid/datetime/mday-over.toml3
-rw-r--r--tests/data/invalid/burntsushi/invalid/datetime/mday-under.toml3
-rw-r--r--tests/data/invalid/burntsushi/invalid/datetime/minute-over.toml2
-rw-r--r--tests/data/invalid/burntsushi/invalid/datetime/month-over.toml2
-rw-r--r--tests/data/invalid/burntsushi/invalid/datetime/month-under.toml2
-rw-r--r--tests/data/invalid/burntsushi/invalid/datetime/no-leads-with-milli.toml2
-rw-r--r--tests/data/invalid/burntsushi/invalid/datetime/no-leads.toml2
-rw-r--r--tests/data/invalid/burntsushi/invalid/datetime/no-secs.toml2
-rw-r--r--tests/data/invalid/burntsushi/invalid/datetime/no-t.toml2
-rw-r--r--tests/data/invalid/burntsushi/invalid/datetime/second-over.toml3
-rw-r--r--tests/data/invalid/burntsushi/invalid/datetime/time-no-leads-2.toml2
-rw-r--r--tests/data/invalid/burntsushi/invalid/datetime/time-no-leads.toml2
-rw-r--r--tests/data/invalid/burntsushi/invalid/datetime/trailing-t.toml2
-rw-r--r--tests/data/invalid/burntsushi/invalid/encoding/bad-utf8-at-end.toml5
-rw-r--r--tests/data/invalid/burntsushi/invalid/encoding/bad-utf8-in-comment.toml1
-rw-r--r--tests/data/invalid/burntsushi/invalid/encoding/bad-utf8-in-string.toml2
-rw-r--r--tests/data/invalid/burntsushi/invalid/encoding/bom-not-at-start-1.toml1
-rw-r--r--tests/data/invalid/burntsushi/invalid/encoding/bom-not-at-start-2.toml1
-rw-r--r--tests/data/invalid/burntsushi/invalid/encoding/utf16-bom.tomlbin0 -> 38 bytes
-rw-r--r--tests/data/invalid/burntsushi/invalid/encoding/utf16.tomlbin0 -> 42 bytes
-rw-r--r--tests/data/invalid/burntsushi/invalid/float/double-point-1.toml1
-rw-r--r--tests/data/invalid/burntsushi/invalid/float/double-point-2.toml1
-rw-r--r--tests/data/invalid/burntsushi/invalid/float/exp-double-e-1.toml1
-rw-r--r--tests/data/invalid/burntsushi/invalid/float/exp-double-e-2.toml1
-rw-r--r--tests/data/invalid/burntsushi/invalid/float/exp-double-us.toml1
-rw-r--r--tests/data/invalid/burntsushi/invalid/float/exp-leading-us.toml1
-rw-r--r--tests/data/invalid/burntsushi/invalid/float/exp-point-1.toml1
-rw-r--r--tests/data/invalid/burntsushi/invalid/float/exp-point-2.toml1
-rw-r--r--tests/data/invalid/burntsushi/invalid/float/exp-trailing-us.toml1
-rw-r--r--tests/data/invalid/burntsushi/invalid/float/float.multi40
-rw-r--r--tests/data/invalid/burntsushi/invalid/float/inf-incomplete-1.toml1
-rw-r--r--tests/data/invalid/burntsushi/invalid/float/inf-incomplete-2.toml1
-rw-r--r--tests/data/invalid/burntsushi/invalid/float/inf-incomplete-3.toml1
-rw-r--r--tests/data/invalid/burntsushi/invalid/float/inf_underscore.toml1
-rw-r--r--tests/data/invalid/burntsushi/invalid/float/leading-point-neg.toml1
-rw-r--r--tests/data/invalid/burntsushi/invalid/float/leading-point-plus.toml1
-rw-r--r--tests/data/invalid/burntsushi/invalid/float/leading-point.toml1
-rw-r--r--tests/data/invalid/burntsushi/invalid/float/leading-us.toml1
-rw-r--r--tests/data/invalid/burntsushi/invalid/float/leading-zero-neg.toml1
-rw-r--r--tests/data/invalid/burntsushi/invalid/float/leading-zero-plus.toml1
-rw-r--r--tests/data/invalid/burntsushi/invalid/float/leading-zero.toml1
-rw-r--r--tests/data/invalid/burntsushi/invalid/float/nan-incomplete-1.toml1
-rw-r--r--tests/data/invalid/burntsushi/invalid/float/nan-incomplete-2.toml1
-rw-r--r--tests/data/invalid/burntsushi/invalid/float/nan-incomplete-3.toml1
-rw-r--r--tests/data/invalid/burntsushi/invalid/float/nan_underscore.toml1
-rw-r--r--tests/data/invalid/burntsushi/invalid/float/trailing-point-min.toml1
-rw-r--r--tests/data/invalid/burntsushi/invalid/float/trailing-point-plus.toml1
-rw-r--r--tests/data/invalid/burntsushi/invalid/float/trailing-point.toml1
-rw-r--r--tests/data/invalid/burntsushi/invalid/float/trailing-us-exp.toml4
-rw-r--r--tests/data/invalid/burntsushi/invalid/float/trailing-us.toml1
-rw-r--r--tests/data/invalid/burntsushi/invalid/float/us-after-point.toml1
-rw-r--r--tests/data/invalid/burntsushi/invalid/float/us-before-point.toml1
-rw-r--r--tests/data/invalid/burntsushi/invalid/inline-table/double-comma.toml1
-rw-r--r--tests/data/invalid/burntsushi/invalid/inline-table/duplicate-key.toml2
-rw-r--r--tests/data/invalid/burntsushi/invalid/inline-table/empty.toml1
-rw-r--r--tests/data/invalid/burntsushi/invalid/inline-table/linebreak-1.toml4
-rw-r--r--tests/data/invalid/burntsushi/invalid/inline-table/linebreak-2.toml2
-rw-r--r--tests/data/invalid/burntsushi/invalid/inline-table/linebreak-3.toml2
-rw-r--r--tests/data/invalid/burntsushi/invalid/inline-table/linebreak-4.toml4
-rw-r--r--tests/data/invalid/burntsushi/invalid/inline-table/no-comma.toml1
-rw-r--r--tests/data/invalid/burntsushi/invalid/inline-table/overwrite.toml3
-rw-r--r--tests/data/invalid/burntsushi/invalid/inline-table/trailing-comma.toml3
-rw-r--r--tests/data/invalid/burntsushi/invalid/integer/capital-bin.toml1
-rw-r--r--tests/data/invalid/burntsushi/invalid/integer/capital-hex.toml1
-rw-r--r--tests/data/invalid/burntsushi/invalid/integer/capital-oct.toml1
-rw-r--r--tests/data/invalid/burntsushi/invalid/integer/double-sign-nex.toml1
-rw-r--r--tests/data/invalid/burntsushi/invalid/integer/double-sign-plus.toml1
-rw-r--r--tests/data/invalid/burntsushi/invalid/integer/double-us.toml1
-rw-r--r--tests/data/invalid/burntsushi/invalid/integer/integer.multi41
-rw-r--r--tests/data/invalid/burntsushi/invalid/integer/invalid-bin.toml1
-rw-r--r--tests/data/invalid/burntsushi/invalid/integer/invalid-hex.toml1
-rw-r--r--tests/data/invalid/burntsushi/invalid/integer/invalid-oct.toml1
-rw-r--r--tests/data/invalid/burntsushi/invalid/integer/leading-us-bin.toml1
-rw-r--r--tests/data/invalid/burntsushi/invalid/integer/leading-us-hex.toml1
-rw-r--r--tests/data/invalid/burntsushi/invalid/integer/leading-us-oct.toml1
-rw-r--r--tests/data/invalid/burntsushi/invalid/integer/leading-us.toml1
-rw-r--r--tests/data/invalid/burntsushi/invalid/integer/leading-zero-1.toml1
-rw-r--r--tests/data/invalid/burntsushi/invalid/integer/leading-zero-2.toml1
-rw-r--r--tests/data/invalid/burntsushi/invalid/integer/leading-zero-3.toml1
-rw-r--r--tests/data/invalid/burntsushi/invalid/integer/leading-zero-sign-1.toml1
-rw-r--r--tests/data/invalid/burntsushi/invalid/integer/leading-zero-sign-2.toml1
-rw-r--r--tests/data/invalid/burntsushi/invalid/integer/leading-zero-sign-3.toml1
-rw-r--r--tests/data/invalid/burntsushi/invalid/integer/negative-bin.toml1
-rw-r--r--tests/data/invalid/burntsushi/invalid/integer/negative-hex.toml1
-rw-r--r--tests/data/invalid/burntsushi/invalid/integer/negative-oct.toml1
-rw-r--r--tests/data/invalid/burntsushi/invalid/integer/positive-bin.toml1
-rw-r--r--tests/data/invalid/burntsushi/invalid/integer/positive-hex.toml1
-rw-r--r--tests/data/invalid/burntsushi/invalid/integer/positive-oct.toml1
-rw-r--r--tests/data/invalid/burntsushi/invalid/integer/text-after-integer.toml1
-rw-r--r--tests/data/invalid/burntsushi/invalid/integer/trailing-us-bin.toml1
-rw-r--r--tests/data/invalid/burntsushi/invalid/integer/trailing-us-hex.toml1
-rw-r--r--tests/data/invalid/burntsushi/invalid/integer/trailing-us-oct.toml1
-rw-r--r--tests/data/invalid/burntsushi/invalid/integer/trailing-us.toml1
-rw-r--r--tests/data/invalid/burntsushi/invalid/integer/us-after-bin.toml1
-rw-r--r--tests/data/invalid/burntsushi/invalid/integer/us-after-hex.toml1
-rw-r--r--tests/data/invalid/burntsushi/invalid/integer/us-after-oct.toml1
-rw-r--r--tests/data/invalid/burntsushi/invalid/key/after-array.toml1
-rw-r--r--tests/data/invalid/burntsushi/invalid/key/after-table.toml1
-rw-r--r--tests/data/invalid/burntsushi/invalid/key/after-value.toml1
-rw-r--r--tests/data/invalid/burntsushi/invalid/key/bare-invalid-character.toml1
-rw-r--r--tests/data/invalid/burntsushi/invalid/key/dotted-redefine-table.toml4
-rw-r--r--tests/data/invalid/burntsushi/invalid/key/duplicate-keys.toml2
-rw-r--r--tests/data/invalid/burntsushi/invalid/key/duplicate.toml3
-rw-r--r--tests/data/invalid/burntsushi/invalid/key/empty.toml1
-rw-r--r--tests/data/invalid/burntsushi/invalid/key/escape.toml1
-rw-r--r--tests/data/invalid/burntsushi/invalid/key/hash.toml1
-rw-r--r--tests/data/invalid/burntsushi/invalid/key/multiline.toml2
-rw-r--r--tests/data/invalid/burntsushi/invalid/key/newline.toml2
-rw-r--r--tests/data/invalid/burntsushi/invalid/key/no-eol.toml1
-rw-r--r--tests/data/invalid/burntsushi/invalid/key/open-bracket.toml1
-rw-r--r--tests/data/invalid/burntsushi/invalid/key/partial-quoted.toml1
-rw-r--r--tests/data/invalid/burntsushi/invalid/key/single-open-bracket.toml1
-rw-r--r--tests/data/invalid/burntsushi/invalid/key/space.toml1
-rw-r--r--tests/data/invalid/burntsushi/invalid/key/special-character.toml1
-rw-r--r--tests/data/invalid/burntsushi/invalid/key/start-bracket.toml3
-rw-r--r--tests/data/invalid/burntsushi/invalid/key/two-equals.toml1
-rw-r--r--tests/data/invalid/burntsushi/invalid/key/two-equals2.toml1
-rw-r--r--tests/data/invalid/burntsushi/invalid/key/two-equals3.toml1
-rw-r--r--tests/data/invalid/burntsushi/invalid/key/without-value-1.toml1
-rw-r--r--tests/data/invalid/burntsushi/invalid/key/without-value-2.toml1
-rw-r--r--tests/data/invalid/burntsushi/invalid/string/bad-byte-escape.toml1
-rw-r--r--tests/data/invalid/burntsushi/invalid/string/bad-codepoint.toml1
-rw-r--r--tests/data/invalid/burntsushi/invalid/string/bad-concat.toml1
-rw-r--r--tests/data/invalid/burntsushi/invalid/string/bad-escape-1.toml1
-rw-r--r--tests/data/invalid/burntsushi/invalid/string/bad-escape-2.toml2
-rw-r--r--tests/data/invalid/burntsushi/invalid/string/bad-multiline.toml2
-rw-r--r--tests/data/invalid/burntsushi/invalid/string/bad-slash-escape.toml1
-rw-r--r--tests/data/invalid/burntsushi/invalid/string/bad-uni-esc.toml1
-rw-r--r--tests/data/invalid/burntsushi/invalid/string/basic-byte-escapes.toml1
-rw-r--r--tests/data/invalid/burntsushi/invalid/string/basic-multiline-out-of-range-unicode-escape-1.toml1
-rw-r--r--tests/data/invalid/burntsushi/invalid/string/basic-multiline-out-of-range-unicode-escape-2.toml1
-rw-r--r--tests/data/invalid/burntsushi/invalid/string/basic-multiline-quotes.toml1
-rw-r--r--tests/data/invalid/burntsushi/invalid/string/basic-multiline-unknown-escape.toml1
-rw-r--r--tests/data/invalid/burntsushi/invalid/string/basic-out-of-range-unicode-escape-1.toml1
-rw-r--r--tests/data/invalid/burntsushi/invalid/string/basic-out-of-range-unicode-escape-2.toml1
-rw-r--r--tests/data/invalid/burntsushi/invalid/string/basic-unknown-escape.toml1
-rw-r--r--tests/data/invalid/burntsushi/invalid/string/literal-multiline-quotes-1.toml2
-rw-r--r--tests/data/invalid/burntsushi/invalid/string/literal-multiline-quotes-2.toml1
-rw-r--r--tests/data/invalid/burntsushi/invalid/string/missing-quotes.toml1
-rw-r--r--tests/data/invalid/burntsushi/invalid/string/multiline-bad-escape-1.toml2
-rw-r--r--tests/data/invalid/burntsushi/invalid/string/multiline-bad-escape-2.toml2
-rw-r--r--tests/data/invalid/burntsushi/invalid/string/multiline-bad-escape-3.toml3
-rw-r--r--tests/data/invalid/burntsushi/invalid/string/multiline-escape-space.toml3
-rw-r--r--tests/data/invalid/burntsushi/invalid/string/multiline-no-close-2.toml1
-rw-r--r--tests/data/invalid/burntsushi/invalid/string/multiline-no-close.toml2
-rw-r--r--tests/data/invalid/burntsushi/invalid/string/multiline-quotes-1.toml1
-rw-r--r--tests/data/invalid/burntsushi/invalid/string/multiline-quotes-2.toml1
-rw-r--r--tests/data/invalid/burntsushi/invalid/string/no-close.toml1
-rw-r--r--tests/data/invalid/burntsushi/invalid/string/text-after-string.toml1
-rw-r--r--tests/data/invalid/burntsushi/invalid/string/wrong-close.toml1
-rw-r--r--tests/data/invalid/burntsushi/invalid/table/append-with-dotted-keys-1.toml17
-rw-r--r--tests/data/invalid/burntsushi/invalid/table/append-with-dotted-keys-2.toml8
-rw-r--r--tests/data/invalid/burntsushi/invalid/table/array-empty.toml2
-rw-r--r--tests/data/invalid/burntsushi/invalid/table/array-implicit.toml14
-rw-r--r--tests/data/invalid/burntsushi/invalid/table/array-missing-bracket.toml2
-rw-r--r--tests/data/invalid/burntsushi/invalid/table/duplicate-key-dotted-table.toml4
-rw-r--r--tests/data/invalid/burntsushi/invalid/table/duplicate-key-dotted-table2.toml4
-rw-r--r--tests/data/invalid/burntsushi/invalid/table/duplicate-key-table.toml5
-rw-r--r--tests/data/invalid/burntsushi/invalid/table/duplicate-table-array.toml2
-rw-r--r--tests/data/invalid/burntsushi/invalid/table/duplicate-table-array2.toml2
-rw-r--r--tests/data/invalid/burntsushi/invalid/table/duplicate.toml5
-rw-r--r--tests/data/invalid/burntsushi/invalid/table/empty-implicit-table.toml1
-rw-r--r--tests/data/invalid/burntsushi/invalid/table/empty.toml1
-rw-r--r--tests/data/invalid/burntsushi/invalid/table/equals-sign.toml1
-rw-r--r--tests/data/invalid/burntsushi/invalid/table/llbrace.toml1
-rw-r--r--tests/data/invalid/burntsushi/invalid/table/nested-brackets-close.toml2
-rw-r--r--tests/data/invalid/burntsushi/invalid/table/nested-brackets-open.toml2
-rw-r--r--tests/data/invalid/burntsushi/invalid/table/quoted-no-close.toml2
-rw-r--r--tests/data/invalid/burntsushi/invalid/table/redefine.toml6
-rw-r--r--tests/data/invalid/burntsushi/invalid/table/rrbrace.toml1
-rw-r--r--tests/data/invalid/burntsushi/invalid/table/text-after-table.toml1
-rw-r--r--tests/data/invalid/burntsushi/invalid/table/whitespace.toml1
-rw-r--r--tests/data/invalid/burntsushi/invalid/table/with-pound.toml2
-rw-r--r--tests/data/invalid/dates-and-times/invalid-day.toml1
-rw-r--r--tests/data/invalid/dotted-keys/access-non-table.toml2
-rw-r--r--tests/data/invalid/dotted-keys/extend-defined-aot.toml3
-rw-r--r--tests/data/invalid/dotted-keys/extend-defined-table-with-subtable.toml4
-rw-r--r--tests/data/invalid/dotted-keys/extend-defined-table.toml4
-rw-r--r--tests/data/invalid/inline-table-missing-comma.toml1
-rw-r--r--tests/data/invalid/inline-table/define-twice-in-subtable.toml1
-rw-r--r--tests/data/invalid/inline-table/define-twice.toml1
-rw-r--r--tests/data/invalid/inline-table/file-end-after-key-val.toml1
-rw-r--r--tests/data/invalid/inline-table/mutate.toml2
-rw-r--r--tests/data/invalid/inline-table/override-val-in-table.toml5
-rw-r--r--tests/data/invalid/inline-table/override-val-with-array.toml3
-rw-r--r--tests/data/invalid/inline-table/override-val-with-table.toml3
-rw-r--r--tests/data/invalid/inline-table/overwrite-implicitly.toml1
-rw-r--r--tests/data/invalid/inline-table/overwrite-value-in-inner-array.toml1
-rw-r--r--tests/data/invalid/inline-table/overwrite-value-in-inner-table.toml1
-rw-r--r--tests/data/invalid/inline-table/unclosed-empty.toml1
-rw-r--r--tests/data/invalid/invalid-comment-char.toml1
-rw-r--r--tests/data/invalid/invalid-escaped-unicode.toml1
-rw-r--r--tests/data/invalid/invalid-hex.toml1
-rw-r--r--tests/data/invalid/keys-and-vals/ends-early-table-def.toml1
-rw-r--r--tests/data/invalid/keys-and-vals/ends-early.toml1
-rw-r--r--tests/data/invalid/keys-and-vals/no-value.toml1
-rw-r--r--tests/data/invalid/keys-and-vals/only-ws-after-dot.toml1
-rw-r--r--tests/data/invalid/keys-and-vals/overwrite-with-deep-table.toml2
-rw-r--r--tests/data/invalid/literal-str/unclosed.toml1
-rw-r--r--tests/data/invalid/missing-closing-double-square-bracket.toml2
-rw-r--r--tests/data/invalid/missing-closing-square-bracket.toml2
-rw-r--r--tests/data/invalid/multiline-basic-str/carriage-return.toml2
-rw-r--r--tests/data/invalid/multiline-basic-str/escape-only.toml1
-rw-r--r--tests/data/invalid/multiline-basic-str/file-ends-after-opening.toml1
-rw-r--r--tests/data/invalid/multiline-basic-str/last-line-escape.toml4
-rw-r--r--tests/data/invalid/multiline-basic-str/unclosed-ends-in-whitespace-escape.toml3
-rw-r--r--tests/data/invalid/multiline-literal-str/file-ends-after-opening.toml1
-rw-r--r--tests/data/invalid/multiline-literal-str/unclosed.toml3
-rw-r--r--tests/data/invalid/non-scalar-escaped.toml1
-rw-r--r--tests/data/invalid/table/eof-after-opening.toml1
-rw-r--r--tests/data/invalid/table/redefine-1.toml3
-rw-r--r--tests/data/invalid/table/redefine-2.toml3
-rw-r--r--tests/data/invalid/toml-lang-compliance/LICENSE23
-rw-r--r--tests/data/invalid/toml-lang-compliance/README.md6
-rw-r--r--tests/data/invalid/toml-lang-compliance/invalid/array/array-of-tables-1.toml4
-rw-r--r--tests/data/invalid/toml-lang-compliance/invalid/array/array-of-tables-2.toml10
-rw-r--r--tests/data/invalid/toml-lang-compliance/invalid/comment/comment-control-1.tomlbin0 -> 15 bytes
-rw-r--r--tests/data/invalid/toml-lang-compliance/invalid/comment/comment-control-2.toml1
-rw-r--r--tests/data/invalid/toml-lang-compliance/invalid/comment/comment-control-3.toml1
-rw-r--r--tests/data/invalid/toml-lang-compliance/invalid/comment/comment-control-4.toml1
-rw-r--r--tests/data/invalid/toml-lang-compliance/invalid/integer/int-0-padded.toml1
-rw-r--r--tests/data/invalid/toml-lang-compliance/invalid/integer/int-signed-bin.toml1
-rw-r--r--tests/data/invalid/toml-lang-compliance/invalid/integer/int-signed-hex.toml1
-rw-r--r--tests/data/invalid/toml-lang-compliance/invalid/integer/int-signed-oct.toml1
-rw-r--r--tests/data/invalid/toml-lang-compliance/invalid/key-value/bare-key-1.toml1
-rw-r--r--tests/data/invalid/toml-lang-compliance/invalid/key-value/bare-key-2.toml2
-rw-r--r--tests/data/invalid/toml-lang-compliance/invalid/key-value/bare-key-3.toml1
-rw-r--r--tests/data/invalid/toml-lang-compliance/invalid/key-value/key-value-pair-1.toml1
-rw-r--r--tests/data/invalid/toml-lang-compliance/invalid/key-value/key-value-pair-2.toml1
-rw-r--r--tests/data/invalid/toml-lang-compliance/invalid/key-value/multiple-dot-key.toml8
-rw-r--r--tests/data/invalid/toml-lang-compliance/invalid/key-value/multiple-key.toml3
-rw-r--r--tests/data/invalid/toml-lang-compliance/invalid/key-value/no-key-name.toml1
-rw-r--r--tests/data/invalid/toml-lang-compliance/invalid/string/string-basic-control-1.tomlbin0 -> 12 bytes
-rw-r--r--tests/data/invalid/toml-lang-compliance/invalid/string/string-basic-control-2.toml1
-rw-r--r--tests/data/invalid/toml-lang-compliance/invalid/string/string-basic-control-3.toml1
-rw-r--r--tests/data/invalid/toml-lang-compliance/invalid/string/string-basic-control-4.toml1
-rw-r--r--tests/data/invalid/toml-lang-compliance/invalid/string/string-basic-multiline-control-1.tomlbin0 -> 16 bytes
-rw-r--r--tests/data/invalid/toml-lang-compliance/invalid/string/string-basic-multiline-control-2.toml1
-rw-r--r--tests/data/invalid/toml-lang-compliance/invalid/string/string-basic-multiline-control-3.toml1
-rw-r--r--tests/data/invalid/toml-lang-compliance/invalid/string/string-basic-multiline-control-4.toml1
-rw-r--r--tests/data/invalid/toml-lang-compliance/invalid/string/string-basic-multiline-invalid-backslash.toml3
-rw-r--r--tests/data/invalid/toml-lang-compliance/invalid/string/string-basic-multiline-out-of-range-unicode-escape-1.toml1
-rw-r--r--tests/data/invalid/toml-lang-compliance/invalid/string/string-basic-multiline-out-of-range-unicode-escape-2.toml1
-rw-r--r--tests/data/invalid/toml-lang-compliance/invalid/string/string-basic-multiline-quotes.toml1
-rw-r--r--tests/data/invalid/toml-lang-compliance/invalid/string/string-basic-multiline-unknown-escape.toml1
-rw-r--r--tests/data/invalid/toml-lang-compliance/invalid/string/string-basic-out-of-range-unicode-escape-1.toml1
-rw-r--r--tests/data/invalid/toml-lang-compliance/invalid/string/string-basic-out-of-range-unicode-escape-2.toml1
-rw-r--r--tests/data/invalid/toml-lang-compliance/invalid/string/string-basic-unknown-escape.toml1
-rw-r--r--tests/data/invalid/toml-lang-compliance/invalid/string/string-literal-control-1.tomlbin0 -> 12 bytes
-rw-r--r--tests/data/invalid/toml-lang-compliance/invalid/string/string-literal-control-2.toml1
-rw-r--r--tests/data/invalid/toml-lang-compliance/invalid/string/string-literal-control-3.toml1
-rw-r--r--tests/data/invalid/toml-lang-compliance/invalid/string/string-literal-control-4.toml1
-rw-r--r--tests/data/invalid/toml-lang-compliance/invalid/string/string-literal-multiline-control-1.tomlbin0 -> 16 bytes
-rw-r--r--tests/data/invalid/toml-lang-compliance/invalid/string/string-literal-multiline-control-2.toml1
-rw-r--r--tests/data/invalid/toml-lang-compliance/invalid/string/string-literal-multiline-control-4.toml1
-rw-r--r--tests/data/invalid/toml-lang-compliance/invalid/string/string-literal-multiline-quotes.toml1
-rw-r--r--tests/data/invalid/toml-lang-compliance/invalid/table/inline-table-immutable-1.toml3
-rw-r--r--tests/data/invalid/toml-lang-compliance/invalid/table/inline-table-immutable-2.toml3
-rw-r--r--tests/data/invalid/toml-lang-compliance/invalid/table/inline-table-trailing-comma.toml1
-rw-r--r--tests/data/invalid/toml-lang-compliance/invalid/table/table-1.toml7
-rw-r--r--tests/data/invalid/toml-lang-compliance/invalid/table/table-2.toml7
-rw-r--r--tests/data/invalid/toml-lang-compliance/invalid/table/table-3.toml5
-rw-r--r--tests/data/invalid/toml-lang-compliance/invalid/table/table-4.toml5
-rw-r--r--tests/data/invalid/toml-lang-compliance/invalid/table/table-invalid-1.toml7
-rw-r--r--tests/data/invalid/toml-lang-compliance/invalid/table/table-invalid-2.toml4
-rw-r--r--tests/data/invalid/toml-lang-compliance/invalid/table/table-invalid-3.toml14
-rw-r--r--tests/data/invalid/toml-lang-compliance/invalid/table/table-invalid-4.toml14
-rw-r--r--tests/data/invalid/unclosed-multiline-string.toml4
-rw-r--r--tests/data/invalid/unclosed-string.toml1
-rw-r--r--tests/data/valid/apostrophes-in-literal-string.json1
-rw-r--r--tests/data/valid/apostrophes-in-literal-string.toml3
-rw-r--r--tests/data/valid/array/array-subtables.json11
-rw-r--r--tests/data/valid/array/array-subtables.toml7
-rw-r--r--tests/data/valid/array/open-parent-table.json6
-rw-r--r--tests/data/valid/array/open-parent-table.toml4
-rw-r--r--tests/data/valid/boolean.json4
-rw-r--r--tests/data/valid/boolean.toml2
-rw-r--r--tests/data/valid/burntsushi/COPYING21
-rw-r--r--tests/data/valid/burntsushi/valid/array/array.json68
-rw-r--r--tests/data/valid/burntsushi/valid/array/array.toml12
-rw-r--r--tests/data/valid/burntsushi/valid/array/bool.json12
-rw-r--r--tests/data/valid/burntsushi/valid/array/bool.toml1
-rw-r--r--tests/data/valid/burntsushi/valid/array/empty.json11
-rw-r--r--tests/data/valid/burntsushi/valid/array/empty.toml1
-rw-r--r--tests/data/valid/burntsushi/valid/array/hetergeneous.json34
-rw-r--r--tests/data/valid/burntsushi/valid/array/hetergeneous.toml1
-rw-r--r--tests/data/valid/burntsushi/valid/array/mixed-int-array.json14
-rw-r--r--tests/data/valid/burntsushi/valid/array/mixed-int-array.toml1
-rw-r--r--tests/data/valid/burntsushi/valid/array/mixed-int-float.json12
-rw-r--r--tests/data/valid/burntsushi/valid/array/mixed-int-float.toml1
-rw-r--r--tests/data/valid/burntsushi/valid/array/mixed-int-string.json12
-rw-r--r--tests/data/valid/burntsushi/valid/array/mixed-int-string.toml1
-rw-r--r--tests/data/valid/burntsushi/valid/array/mixed-string-table.json22
-rw-r--r--tests/data/valid/burntsushi/valid/array/mixed-string-table.toml4
-rw-r--r--tests/data/valid/burntsushi/valid/array/nested-double.json28
-rw-r--r--tests/data/valid/burntsushi/valid/array/nested-double.toml6
-rw-r--r--tests/data/valid/burntsushi/valid/array/nested-inline-table.json7
-rw-r--r--tests/data/valid/burntsushi/valid/array/nested-inline-table.toml1
-rw-r--r--tests/data/valid/burntsushi/valid/array/nested.json16
-rw-r--r--tests/data/valid/burntsushi/valid/array/nested.toml1
-rw-r--r--tests/data/valid/burntsushi/valid/array/nospaces.json16
-rw-r--r--tests/data/valid/burntsushi/valid/array/nospaces.toml1
-rw-r--r--tests/data/valid/burntsushi/valid/array/string-quote-comma-2.json8
-rw-r--r--tests/data/valid/burntsushi/valid/array/string-quote-comma-2.toml1
-rw-r--r--tests/data/valid/burntsushi/valid/array/string-quote-comma.json12
-rw-r--r--tests/data/valid/burntsushi/valid/array/string-quote-comma.toml4
-rw-r--r--tests/data/valid/burntsushi/valid/array/string-with-comma.json12
-rw-r--r--tests/data/valid/burntsushi/valid/array/string-with-comma.toml4
-rw-r--r--tests/data/valid/burntsushi/valid/array/strings.json20
-rw-r--r--tests/data/valid/burntsushi/valid/array/strings.toml1
-rw-r--r--tests/data/valid/burntsushi/valid/array/table-array-string-backslash.json10
-rw-r--r--tests/data/valid/burntsushi/valid/array/table-array-string-backslash.toml1
-rw-r--r--tests/data/valid/burntsushi/valid/bool/bool.json10
-rw-r--r--tests/data/valid/burntsushi/valid/bool/bool.toml2
-rw-r--r--tests/data/valid/burntsushi/valid/comment/at-eof.json6
-rw-r--r--tests/data/valid/burntsushi/valid/comment/at-eof.toml2
-rw-r--r--tests/data/valid/burntsushi/valid/comment/at-eof2.json6
-rw-r--r--tests/data/valid/burntsushi/valid/comment/at-eof2.toml2
-rw-r--r--tests/data/valid/burntsushi/valid/comment/everywhere.json26
-rw-r--r--tests/data/valid/burntsushi/valid/comment/everywhere.toml28
-rw-r--r--tests/data/valid/burntsushi/valid/comment/noeol.json1
-rw-r--r--tests/data/valid/burntsushi/valid/comment/noeol.toml1
-rw-r--r--tests/data/valid/burntsushi/valid/comment/tricky.json98
-rw-r--r--tests/data/valid/burntsushi/valid/comment/tricky.toml31
-rw-r--r--tests/data/valid/burntsushi/valid/datetime/datetime.json10
-rw-r--r--tests/data/valid/burntsushi/valid/datetime/datetime.toml2
-rw-r--r--tests/data/valid/burntsushi/valid/datetime/local-date.json6
-rw-r--r--tests/data/valid/burntsushi/valid/datetime/local-date.toml1
-rw-r--r--tests/data/valid/burntsushi/valid/datetime/local-time.json10
-rw-r--r--tests/data/valid/burntsushi/valid/datetime/local-time.toml2
-rw-r--r--tests/data/valid/burntsushi/valid/datetime/local.json14
-rw-r--r--tests/data/valid/burntsushi/valid/datetime/local.toml3
-rw-r--r--tests/data/valid/burntsushi/valid/datetime/milliseconds.json18
-rw-r--r--tests/data/valid/burntsushi/valid/datetime/milliseconds.toml4
-rw-r--r--tests/data/valid/burntsushi/valid/datetime/timezone.json18
-rw-r--r--tests/data/valid/burntsushi/valid/datetime/timezone.toml4
-rw-r--r--tests/data/valid/burntsushi/valid/empty-file.json1
-rw-r--r--tests/data/valid/burntsushi/valid/empty-file.toml0
-rw-r--r--tests/data/valid/burntsushi/valid/example.json26
-rw-r--r--tests/data/valid/burntsushi/valid/example.toml5
-rw-r--r--tests/data/valid/burntsushi/valid/float/exponent.json34
-rw-r--r--tests/data/valid/burntsushi/valid/float/exponent.toml8
-rw-r--r--tests/data/valid/burntsushi/valid/float/float.json18
-rw-r--r--tests/data/valid/burntsushi/valid/float/float.toml4
-rw-r--r--tests/data/valid/burntsushi/valid/float/inf-and-nan.json26
-rw-r--r--tests/data/valid/burntsushi/valid/float/inf-and-nan.toml8
-rw-r--r--tests/data/valid/burntsushi/valid/float/long.json10
-rw-r--r--tests/data/valid/burntsushi/valid/float/long.toml2
-rw-r--r--tests/data/valid/burntsushi/valid/float/underscore.json14
-rw-r--r--tests/data/valid/burntsushi/valid/float/underscore.toml3
-rw-r--r--tests/data/valid/burntsushi/valid/float/zero.json30
-rw-r--r--tests/data/valid/burntsushi/valid/float/zero.toml7
-rw-r--r--tests/data/valid/burntsushi/valid/implicit-and-explicit-after.json16
-rw-r--r--tests/data/valid/burntsushi/valid/implicit-and-explicit-after.toml5
-rw-r--r--tests/data/valid/burntsushi/valid/implicit-and-explicit-before.json16
-rw-r--r--tests/data/valid/burntsushi/valid/implicit-and-explicit-before.toml5
-rw-r--r--tests/data/valid/burntsushi/valid/implicit-groups.json12
-rw-r--r--tests/data/valid/burntsushi/valid/implicit-groups.toml2
-rw-r--r--tests/data/valid/burntsushi/valid/inline-table/array.json34
-rw-r--r--tests/data/valid/burntsushi/valid/inline-table/array.toml3
-rw-r--r--tests/data/valid/burntsushi/valid/inline-table/bool.json12
-rw-r--r--tests/data/valid/burntsushi/valid/inline-table/bool.toml1
-rw-r--r--tests/data/valid/burntsushi/valid/inline-table/empty.json30
-rw-r--r--tests/data/valid/burntsushi/valid/inline-table/empty.toml6
-rw-r--r--tests/data/valid/burntsushi/valid/inline-table/end-in-bool.json16
-rw-r--r--tests/data/valid/burntsushi/valid/inline-table/end-in-bool.toml1
-rw-r--r--tests/data/valid/burntsushi/valid/inline-table/inline-table.json48
-rw-r--r--tests/data/valid/burntsushi/valid/inline-table/inline-table.toml5
-rw-r--r--tests/data/valid/burntsushi/valid/inline-table/key-dotted.json140
-rw-r--r--tests/data/valid/burntsushi/valid/inline-table/key-dotted.toml23
-rw-r--r--tests/data/valid/burntsushi/valid/inline-table/multiline.json20
-rw-r--r--tests/data/valid/burntsushi/valid/inline-table/multiline.toml4
-rw-r--r--tests/data/valid/burntsushi/valid/inline-table/nest.json64
-rw-r--r--tests/data/valid/burntsushi/valid/inline-table/nest.toml10
-rw-r--r--tests/data/valid/burntsushi/valid/integer/integer.json18
-rw-r--r--tests/data/valid/burntsushi/valid/integer/integer.toml4
-rw-r--r--tests/data/valid/burntsushi/valid/integer/literals.json38
-rw-r--r--tests/data/valid/burntsushi/valid/integer/literals.toml11
-rw-r--r--tests/data/valid/burntsushi/valid/integer/long.json10
-rw-r--r--tests/data/valid/burntsushi/valid/integer/long.toml2
-rw-r--r--tests/data/valid/burntsushi/valid/integer/underscore.json10
-rw-r--r--tests/data/valid/burntsushi/valid/integer/underscore.toml2
-rw-r--r--tests/data/valid/burntsushi/valid/integer/zero.json50
-rw-r--r--tests/data/valid/burntsushi/valid/integer/zero.toml15
-rw-r--r--tests/data/valid/burntsushi/valid/key/alphanum.json46
-rw-r--r--tests/data/valid/burntsushi/valid/key/alphanum.toml14
-rw-r--r--tests/data/valid/burntsushi/valid/key/case-sensitive.json38
-rw-r--r--tests/data/valid/burntsushi/valid/key/case-sensitive.toml13
-rw-r--r--tests/data/valid/burntsushi/valid/key/dotted.json132
-rw-r--r--tests/data/valid/burntsushi/valid/key/dotted.toml35
-rw-r--r--tests/data/valid/burntsushi/valid/key/empty.json6
-rw-r--r--tests/data/valid/burntsushi/valid/key/empty.toml1
-rw-r--r--tests/data/valid/burntsushi/valid/key/equals-nospace.json6
-rw-r--r--tests/data/valid/burntsushi/valid/key/equals-nospace.toml1
-rw-r--r--tests/data/valid/burntsushi/valid/key/escapes.json24
-rw-r--r--tests/data/valid/burntsushi/valid/key/escapes.toml10
-rw-r--r--tests/data/valid/burntsushi/valid/key/numeric-dotted.json8
-rw-r--r--tests/data/valid/burntsushi/valid/key/numeric-dotted.toml1
-rw-r--r--tests/data/valid/burntsushi/valid/key/numeric.json6
-rw-r--r--tests/data/valid/burntsushi/valid/key/numeric.toml1
-rw-r--r--tests/data/valid/burntsushi/valid/key/quoted-dots.json32
-rw-r--r--tests/data/valid/burntsushi/valid/key/quoted-dots.toml10
-rw-r--r--tests/data/valid/burntsushi/valid/key/space.json6
-rw-r--r--tests/data/valid/burntsushi/valid/key/space.toml1
-rw-r--r--tests/data/valid/burntsushi/valid/key/special-chars.json6
-rw-r--r--tests/data/valid/burntsushi/valid/key/special-chars.toml1
-rw-r--r--tests/data/valid/burntsushi/valid/key/special-word.json18
-rw-r--r--tests/data/valid/burntsushi/valid/key/special-word.toml5
-rw-r--r--tests/data/valid/burntsushi/valid/newline-crlf.json10
-rw-r--r--tests/data/valid/burntsushi/valid/newline-crlf.toml2
-rw-r--r--tests/data/valid/burntsushi/valid/newline-lf.json10
-rw-r--r--tests/data/valid/burntsushi/valid/newline-lf.toml2
-rw-r--r--tests/data/valid/burntsushi/valid/spec-example-1-compact.json100
-rw-r--r--tests/data/valid/burntsushi/valid/spec-example-1-compact.toml23
-rw-r--r--tests/data/valid/burntsushi/valid/spec-example-1.json100
-rw-r--r--tests/data/valid/burntsushi/valid/spec-example-1.toml33
-rw-r--r--tests/data/valid/burntsushi/valid/string/double-quote-escape.json6
-rw-r--r--tests/data/valid/burntsushi/valid/string/double-quote-escape.toml1
-rw-r--r--tests/data/valid/burntsushi/valid/string/empty.json6
-rw-r--r--tests/data/valid/burntsushi/valid/string/empty.toml1
-rw-r--r--tests/data/valid/burntsushi/valid/string/escape-tricky.json30
-rw-r--r--tests/data/valid/burntsushi/valid/string/escape-tricky.toml15
-rw-r--r--tests/data/valid/burntsushi/valid/string/escaped-escape.json6
-rw-r--r--tests/data/valid/burntsushi/valid/string/escaped-escape.toml1
-rw-r--r--tests/data/valid/burntsushi/valid/string/escapes.json54
-rw-r--r--tests/data/valid/burntsushi/valid/string/escapes.toml13
-rw-r--r--tests/data/valid/burntsushi/valid/string/multiline-quotes.json42
-rw-r--r--tests/data/valid/burntsushi/valid/string/multiline-quotes.toml15
-rw-r--r--tests/data/valid/burntsushi/valid/string/multiline.json54
-rw-r--r--tests/data/valid/burntsushi/valid/string/multiline.toml52
-rw-r--r--tests/data/valid/burntsushi/valid/string/nl.json22
-rw-r--r--tests/data/valid/burntsushi/valid/string/nl.toml6
-rw-r--r--tests/data/valid/burntsushi/valid/string/raw-multiline.json14
-rw-r--r--tests/data/valid/burntsushi/valid/string/raw-multiline.toml14
-rw-r--r--tests/data/valid/burntsushi/valid/string/raw.json30
-rw-r--r--tests/data/valid/burntsushi/valid/string/raw.toml7
-rw-r--r--tests/data/valid/burntsushi/valid/string/simple.json6
-rw-r--r--tests/data/valid/burntsushi/valid/string/simple.toml1
-rw-r--r--tests/data/valid/burntsushi/valid/string/unicode-escape.json10
-rw-r--r--tests/data/valid/burntsushi/valid/string/unicode-escape.toml2
-rw-r--r--tests/data/valid/burntsushi/valid/string/unicode-literal.json6
-rw-r--r--tests/data/valid/burntsushi/valid/string/unicode-literal.toml1
-rw-r--r--tests/data/valid/burntsushi/valid/string/with-pound.json10
-rw-r--r--tests/data/valid/burntsushi/valid/string/with-pound.toml2
-rw-r--r--tests/data/valid/burntsushi/valid/table/array-implicit.json12
-rw-r--r--tests/data/valid/burntsushi/valid/table/array-implicit.toml2
-rw-r--r--tests/data/valid/burntsushi/valid/table/array-many.json34
-rw-r--r--tests/data/valid/burntsushi/valid/table/array-many.toml11
-rw-r--r--tests/data/valid/burntsushi/valid/table/array-nest.json44
-rw-r--r--tests/data/valid/burntsushi/valid/table/array-nest.toml17
-rw-r--r--tests/data/valid/burntsushi/valid/table/array-one.json14
-rw-r--r--tests/data/valid/burntsushi/valid/table/array-one.toml3
-rw-r--r--tests/data/valid/burntsushi/valid/table/array-table-array.json24
-rw-r--r--tests/data/valid/burntsushi/valid/table/array-table-array.toml7
-rw-r--r--tests/data/valid/burntsushi/valid/table/empty.json3
-rw-r--r--tests/data/valid/burntsushi/valid/table/empty.toml1
-rw-r--r--tests/data/valid/burntsushi/valid/table/keyword.json6
-rw-r--r--tests/data/valid/burntsushi/valid/table/keyword.toml9
-rw-r--r--tests/data/valid/burntsushi/valid/table/names.json30
-rw-r--r--tests/data/valid/burntsushi/valid/table/names.toml9
-rw-r--r--tests/data/valid/burntsushi/valid/table/no-eol.json3
-rw-r--r--tests/data/valid/burntsushi/valid/table/no-eol.toml1
-rw-r--r--tests/data/valid/burntsushi/valid/table/sub-empty.json5
-rw-r--r--tests/data/valid/burntsushi/valid/table/sub-empty.toml2
-rw-r--r--tests/data/valid/burntsushi/valid/table/whitespace.json3
-rw-r--r--tests/data/valid/burntsushi/valid/table/whitespace.toml1
-rw-r--r--tests/data/valid/burntsushi/valid/table/with-literal-string.json12
-rw-r--r--tests/data/valid/burntsushi/valid/table/with-literal-string.toml4
-rw-r--r--tests/data/valid/burntsushi/valid/table/with-pound.json8
-rw-r--r--tests/data/valid/burntsushi/valid/table/with-pound.toml2
-rw-r--r--tests/data/valid/burntsushi/valid/table/with-single-quotes.json12
-rw-r--r--tests/data/valid/burntsushi/valid/table/with-single-quotes.toml4
-rw-r--r--tests/data/valid/burntsushi/valid/table/without-super.json9
-rw-r--r--tests/data/valid/burntsushi/valid/table/without-super.toml5
-rw-r--r--tests/data/valid/dates-and-times/datetimes.json4
-rw-r--r--tests/data/valid/dates-and-times/datetimes.toml2
-rw-r--r--tests/data/valid/dates-and-times/localtime.json2
-rw-r--r--tests/data/valid/dates-and-times/localtime.toml1
-rw-r--r--tests/data/valid/empty-inline-table.json1
-rw-r--r--tests/data/valid/empty-inline-table.toml1
-rw-r--r--tests/data/valid/five-quotes.json4
-rw-r--r--tests/data/valid/five-quotes.toml6
-rw-r--r--tests/data/valid/hex-char.json5
-rw-r--r--tests/data/valid/hex-char.toml3
-rw-r--r--tests/data/valid/multiline-basic-str/ends-in-whitespace-escape.json1
-rw-r--r--tests/data/valid/multiline-basic-str/ends-in-whitespace-escape.toml6
-rw-r--r--tests/data/valid/no-newlines.json1
-rw-r--r--tests/data/valid/no-newlines.toml1
-rw-r--r--tests/data/valid/toml-lang-compliance/LICENSE23
-rw-r--r--tests/data/valid/toml-lang-compliance/README.md6
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/array/spec-array-1.json5
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/array/spec-array-1.toml1
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/array/spec-array-2.json5
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/array/spec-array-2.toml1
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/array/spec-array-3.json9
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/array/spec-array-3.toml1
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/array/spec-array-4.json6
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/array/spec-array-4.toml1
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/array/spec-array-5.json9
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/array/spec-array-5.toml1
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/array/spec-array-7.json5
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/array/spec-array-7.toml3
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/array/spec-array-8.json4
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/array/spec-array-8.toml4
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/array/spec-array-mixed-number-types.json8
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/array/spec-array-mixed-number-types.toml1
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/array/spec-array-more-mixed-types.json9
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/array/spec-array-more-mixed-types.toml4
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/array/spec-array-of-tables-1.json13
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/array/spec-array-of-tables-1.toml10
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/array/spec-array-of-tables-2.json21
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/array/spec-array-of-tables-2.toml18
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/array/spec-array-of-tables-3.json20
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/array/spec-array-of-tables-3.toml3
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/boolean/spec-boolean-1.json2
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/boolean/spec-boolean-1.toml1
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/boolean/spec-boolean-2.json2
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/boolean/spec-boolean-2.toml1
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/comment/spec-comment-mid-array.json4
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/comment/spec-comment-mid-array.toml6
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/comment/spec-comment-mid-string.json2
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/comment/spec-comment-mid-string.toml1
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/comment/spec-comment-tab.json2
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/comment/spec-comment-tab.toml2
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/comment/spec-comment.json2
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/comment/spec-comment.toml2
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/date-time/spec-date-local-1.json2
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/date-time/spec-date-local-1.toml1
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/date-time/spec-date-time-1.json2
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/date-time/spec-date-time-1.toml1
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/date-time/spec-date-time-2.json2
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/date-time/spec-date-time-2.toml1
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/date-time/spec-date-time-3.json2
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/date-time/spec-date-time-3.toml1
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/date-time/spec-date-time-4.json2
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/date-time/spec-date-time-4.toml1
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/date-time/spec-date-time-5.json2
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/date-time/spec-date-time-5.toml1
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/date-time/spec-date-time-6.json2
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/date-time/spec-date-time-6.toml1
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/date-time/spec-date-time-local-1.json2
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/date-time/spec-date-time-local-1.toml1
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/date-time/spec-date-time-local-2.json2
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/date-time/spec-date-time-local-2.toml1
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/date-time/spec-time-1.json2
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/date-time/spec-time-1.toml1
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/date-time/spec-time-2.json2
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/date-time/spec-time-2.toml1
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/float/spec-float-1.json2
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/float/spec-float-1.toml1
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/float/spec-float-10.json2
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/float/spec-float-10.toml1
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/float/spec-float-11.json2
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/float/spec-float-11.toml1
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/float/spec-float-12.json2
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/float/spec-float-12.toml1
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/float/spec-float-13.json2
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/float/spec-float-13.toml1
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/float/spec-float-14.json2
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/float/spec-float-14.toml1
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/float/spec-float-15.json2
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/float/spec-float-15.toml1
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/float/spec-float-2.json2
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/float/spec-float-2.toml1
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/float/spec-float-3.json2
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/float/spec-float-3.toml1
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/float/spec-float-4.json2
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/float/spec-float-4.toml1
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/float/spec-float-5.json2
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/float/spec-float-5.toml1
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/float/spec-float-6.json2
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/float/spec-float-6.toml1
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/float/spec-float-7.json2
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/float/spec-float-7.toml1
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/float/spec-float-8.json2
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/float/spec-float-8.toml1
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/float/spec-float-9.json2
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/float/spec-float-9.toml1
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/integer/spec-int-1.json2
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/integer/spec-int-1.toml1
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/integer/spec-int-2.json2
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/integer/spec-int-2.toml1
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/integer/spec-int-3.json2
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/integer/spec-int-3.toml1
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/integer/spec-int-3a.json2
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/integer/spec-int-3a.toml1
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/integer/spec-int-3b.json2
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/integer/spec-int-3b.toml1
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/integer/spec-int-4.json2
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/integer/spec-int-4.toml1
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/integer/spec-int-5.json2
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/integer/spec-int-5.toml1
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/integer/spec-int-6.json2
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/integer/spec-int-6.toml1
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/integer/spec-int-7.json2
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/integer/spec-int-7.toml1
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/integer/spec-int-bin1.json2
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/integer/spec-int-bin1.toml1
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/integer/spec-int-hex1.json2
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/integer/spec-int-hex1.toml1
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/integer/spec-int-hex2.json2
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/integer/spec-int-hex2.toml1
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/integer/spec-int-hex3.json2
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/integer/spec-int-hex3.toml1
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/integer/spec-int-max.json2
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/integer/spec-int-max.toml1
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/integer/spec-int-min.json2
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/integer/spec-int-min.toml1
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/integer/spec-int-oct1.json2
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/integer/spec-int-oct1.toml1
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/integer/spec-int-oct2.json2
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/integer/spec-int-oct2.toml1
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/key-value/spec-case-sensitive.json4
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/key-value/spec-case-sensitive.toml3
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/key-value/spec-dotted-keys-1.json10
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/key-value/spec-dotted-keys-1.toml4
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/key-value/spec-dotted-keys-2.json3
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/key-value/spec-dotted-keys-2.toml1
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/key-value/spec-dotted-keys-3.json3
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/key-value/spec-dotted-keys-3.toml1
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/key-value/spec-empty-key-name-1.json2
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/key-value/spec-empty-key-name-1.toml1
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/key-value/spec-empty-key-name-2.json2
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/key-value/spec-empty-key-name-2.toml1
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/key-value/spec-key-value-pair-1.json2
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/key-value/spec-key-value-pair-1.toml1
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/key-value/spec-key-value-pair-2.json2
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/key-value/spec-key-value-pair-2.toml1
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/key-value/spec-key-value-pair-3.json2
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/key-value/spec-key-value-pair-3.toml1
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/key-value/spec-key-value-pair-4.json2
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/key-value/spec-key-value-pair-4.toml1
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/key-value/spec-key-value-pair-5.json2
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/key-value/spec-key-value-pair-5.toml1
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/key-value/spec-key-value-pair-6.json2
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/key-value/spec-key-value-pair-6.toml1
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/key-value/spec-key-value-pair-7.json2
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/key-value/spec-key-value-pair-7.toml1
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/key-value/spec-key-value-pair-8.json2
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/key-value/spec-key-value-pair-8.toml1
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/key-value/spec-key-value-pair-9.json3
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/key-value/spec-key-value-pair-9.toml1
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/key-value/spec-newline-1.json4
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/key-value/spec-newline-1.toml2
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/key-value/spec-newline-2.json4
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/key-value/spec-newline-2.toml2
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/key-value/spec-newline-3.json6
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/key-value/spec-newline-3.toml3
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/key-value/spec-quoted-basic-keys-1.json2
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/key-value/spec-quoted-basic-keys-1.toml1
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/key-value/spec-quoted-literal-keys-1.json2
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/key-value/spec-quoted-literal-keys-1.toml1
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/qa/qa-array-inline-1000.json1003
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/qa/qa-array-inline-1000.toml1003
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/qa/qa-array-inline-nested-1000.toml1
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/qa/qa-key-literal-40kb.json2
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/qa/qa-key-literal-40kb.toml1
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/qa/qa-key-string-40kb.json2
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/qa/qa-key-string-40kb.toml1
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/qa/qa-scalar-literal-40kb.json2
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/qa/qa-scalar-literal-40kb.toml1
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/qa/qa-scalar-literal-multiline-40kb.json2
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/qa/qa-scalar-literal-multiline-40kb.toml99
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/qa/qa-scalar-string-40kb.json2
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/qa/qa-scalar-string-40kb.toml1
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/qa/qa-scalar-string-multiline-40kb.json2
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/qa/qa-scalar-string-multiline-40kb.toml99
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/qa/qa-table-inline-1000.json2
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/qa/qa-table-inline-1000.toml1
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/qa/qa-table-inline-nested-1000.toml1
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/spec-readme-example.json43
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/spec-readme-example.toml33
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/string/spec-string-basic-multiline-1.json2
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/string/spec-string-basic-multiline-1.toml3
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/string/spec-string-basic-multiline-2.json2
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/string/spec-string-basic-multiline-2.toml6
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/string/spec-string-basic-multiline-3.json2
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/string/spec-string-basic-multiline-3.toml5
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/string/spec-string-basic-multiline-4.json2
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/string/spec-string-basic-multiline-4.toml2
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/string/spec-string-basic-multiline-5.json2
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/string/spec-string-basic-multiline-5.toml5
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/string/spec-string-basic-multiline-6.json2
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/string/spec-string-basic-multiline-6.toml1
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/string/spec-string-basic-multiline-7.json2
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/string/spec-string-basic-multiline-7.toml1
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/string/spec-string-basic-multiline-8.json2
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/string/spec-string-basic-multiline-8.toml1
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/string/spec-string-basic-multiline-9.json2
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/string/spec-string-basic-multiline-9.toml1
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/string/spec-string-basic-tab-multiline.json2
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/string/spec-string-basic-tab-multiline.toml1
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/string/spec-string-basic-tab.json2
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/string/spec-string-basic-tab.toml1
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/string/spec-string-basic.json2
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/string/spec-string-basic.toml1
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/string/spec-string-escape-1.json2
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/string/spec-string-escape-1.toml1
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/string/spec-string-escape-2.json2
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/string/spec-string-escape-2.toml1
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/string/spec-string-escape-3.json2
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/string/spec-string-escape-3.toml1
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/string/spec-string-escape-4.json2
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/string/spec-string-escape-4.toml1
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/string/spec-string-escape-5.json2
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/string/spec-string-escape-5.toml1
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/string/spec-string-escape-6.json2
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/string/spec-string-escape-6.toml1
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/string/spec-string-escape-7.json2
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/string/spec-string-escape-7.toml1
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/string/spec-string-escape-8.json2
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/string/spec-string-escape-8.toml1
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/string/spec-string-escape-9.json2
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/string/spec-string-escape-9.toml1
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/string/spec-string-literal-1.json2
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/string/spec-string-literal-1.toml1
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/string/spec-string-literal-2.json2
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/string/spec-string-literal-2.toml1
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/string/spec-string-literal-3.json2
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/string/spec-string-literal-3.toml1
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/string/spec-string-literal-4.json2
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/string/spec-string-literal-4.toml1
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/string/spec-string-literal-multiline-1.json2
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/string/spec-string-literal-multiline-1.toml1
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/string/spec-string-literal-multiline-2.json2
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/string/spec-string-literal-multiline-2.toml6
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/string/spec-string-literal-multiline-3.json2
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/string/spec-string-literal-multiline-3.toml1
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/string/spec-string-literal-multiline-4.json2
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/string/spec-string-literal-multiline-4.toml1
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/table/spec-extend-dotted-object-1.json6
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/table/spec-extend-dotted-object-1.toml5
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/table/spec-extend-dotted-object-2.json14
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/table/spec-extend-dotted-object-2.toml10
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/table/spec-extend-dotted-object-3.json14
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/table/spec-extend-dotted-object-3.toml9
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/table/spec-table-1.json10
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/table/spec-table-1.toml7
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/table/spec-table-2.json5
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/table/spec-table-2.toml2
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/table/spec-table-3.json4
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/table/spec-table-3.toml1
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/table/spec-table-4.json4
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/table/spec-table-4.toml1
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/table/spec-table-5.json4
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/table/spec-table-5.toml1
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/table/spec-table-6.json4
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/table/spec-table-6.toml1
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/table/spec-table-7.json5
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/table/spec-table-7.toml5
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/table/spec-table-8.json10
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/table/spec-table-8.toml6
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/table/spec-table-inline-1.json5
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/table/spec-table-inline-1.toml1
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/table/spec-table-inline-2.json5
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/table/spec-table-inline-2.toml1
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/table/spec-table-inline-3.json4
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/table/spec-table-inline-3.toml1
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/table/spec-table.json2
-rw-r--r--tests/data/valid/toml-lang-compliance/valid/table/spec-table.toml1
-rw-r--r--tests/data/valid/trailing-comma.json7
-rw-r--r--tests/data/valid/trailing-comma.toml1
-rw-r--r--tests/test_data.py60
-rw-r--r--tests/test_error.py57
-rw-r--r--tests/test_misc.py101
839 files changed, 9049 insertions, 0 deletions
diff --git a/.bumpversion.cfg b/.bumpversion.cfg
new file mode 100644
index 0000000..b00d23a
--- /dev/null
+++ b/.bumpversion.cfg
@@ -0,0 +1,13 @@
+[bumpversion]
+commit = True
+tag = True
+tag_name = {new_version}
+current_version = 2.0.1
+
+[bumpversion:file:pyproject.toml]
+search = version = "{current_version}" # DO NOT EDIT THIS LINE MANUALLY. LET bump2version UTILITY DO IT
+replace = version = "{new_version}" # DO NOT EDIT THIS LINE MANUALLY. LET bump2version UTILITY DO IT
+
+[bumpversion:file:src/tomli/__init__.py]
+search = __version__ = "{current_version}"
+replace = __version__ = "{new_version}"
diff --git a/.flake8 b/.flake8
new file mode 100644
index 0000000..367e8ec
--- /dev/null
+++ b/.flake8
@@ -0,0 +1,6 @@
+[flake8]
+max-line-length = 88
+max-complexity = 10
+# These checks violate PEP8 so let's ignore them
+extend-ignore = E203
+extend-exclude = */site-packages/*
diff --git a/.github/workflows/tests.yaml b/.github/workflows/tests.yaml
new file mode 100644
index 0000000..63f25cf
--- /dev/null
+++ b/.github/workflows/tests.yaml
@@ -0,0 +1,90 @@
+name: Tests
+
+on:
+ push:
+ branches: [ master ]
+ tags: [ '[0-9]+.[0-9]+.[0-9]+*' ]
+ pull_request:
+ branches: [ master ]
+
+jobs:
+
+ linters:
+ runs-on: ubuntu-latest
+
+ steps:
+ - uses: actions/checkout@v2
+ - uses: actions/setup-python@v2
+ with:
+ python-version: '3.8'
+
+ - name: Install pre-commit
+ run: |
+ pip install pre-commit
+
+ - name: run linters
+ # pre-commit also runs in pre-commit.ci, but let's have it here too
+ # to block `pypi-publish` job from triggering if pre-commit fails
+ run: |
+ pre-commit run -a
+
+ tests:
+ runs-on: ${{ matrix.os }}
+ strategy:
+ matrix:
+ python-version: ['pypy-3.7', '3.7', '3.8', '3.9', '3.10', '3.11-dev']
+ os: [ubuntu-latest, macos-latest, windows-latest]
+ continue-on-error: ${{ matrix.python-version == '3.11-dev' }}
+
+ steps:
+ - uses: actions/checkout@v2
+
+ - name: Set up Python ${{ matrix.python-version }}
+ uses: actions/setup-python@v2
+ with:
+ python-version: ${{ matrix.python-version }}
+
+ - name: Install package and test deps
+ run: |
+ pip install . coverage
+
+ - name: Test with unittest
+ run: |
+ coverage run -m unittest
+ coverage report --fail-under=100
+
+ - name: Report coverage
+ if: matrix.os == 'ubuntu-latest' && matrix.python-version == '3.10'
+ uses: codecov/codecov-action@v2
+
+ allgood:
+ runs-on: ubuntu-latest
+ needs:
+ - tests
+ - linters
+ steps:
+ - run: echo "Great success!"
+
+ pypi-publish:
+ # Only publish if all other jobs succeed
+ needs: [ allgood ]
+ if: github.event_name == 'push' && startsWith(github.event.ref, 'refs/tags')
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v2
+ - uses: actions/setup-python@v2
+ with:
+ python-version: '3.7'
+ - name: Install build and publish tools
+ run: |
+ pip install build twine
+ - name: Build and check
+ run: |
+ rm -rf dist/ && python -m build
+ twine check --strict dist/*
+ - name: Publish
+ run: |
+ twine upload dist/*
+ env:
+ TWINE_USERNAME: __token__
+ TWINE_PASSWORD: ${{ secrets.PYPI_TOKEN }}
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..18bffe1
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,135 @@
+# Byte-compiled / optimized / DLL files
+__pycache__/
+*.py[cod]
+*$py.class
+
+# C extensions
+*.so
+
+# Distribution / packaging
+.Python
+build/
+develop-eggs/
+dist/
+downloads/
+eggs/
+.eggs/
+lib/
+lib64/
+parts/
+sdist/
+var/
+wheels/
+pip-wheel-metadata/
+share/python-wheels/
+*.egg-info/
+.installed.cfg
+*.egg
+MANIFEST
+
+# PyInstaller
+# Usually these files are written by a python script from a template
+# before PyInstaller builds the exe, so as to inject date/other infos into it.
+*.manifest
+*.spec
+
+# Installer logs
+pip-log.txt
+pip-delete-this-directory.txt
+
+# Unit test / coverage reports
+htmlcov/
+.tox/
+.nox/
+.coverage
+.coverage.*
+.cache
+nosetests.xml
+coverage.xml
+*.cover
+*.py,cover
+.hypothesis/
+.pytest_cache/
+
+# Translations
+*.mo
+*.pot
+
+# Django stuff:
+*.log
+local_settings.py
+db.sqlite3
+db.sqlite3-journal
+
+# Flask stuff:
+instance/
+.webassets-cache
+
+# Scrapy stuff:
+.scrapy
+
+# Sphinx documentation
+docs/_build/
+
+# PyBuilder
+target/
+
+# Jupyter Notebook
+.ipynb_checkpoints
+
+# IPython
+profile_default/
+ipython_config.py
+
+# pyenv
+.python-version
+
+# pipenv
+# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
+# However, in case of collaboration, if having platform-specific dependencies or dependencies
+# having no cross-platform support, pipenv may install dependencies that don't work, or not
+# install all needed dependencies.
+#Pipfile.lock
+
+# PEP 582; used by e.g. github.com/David-OConnor/pyflow
+__pypackages__/
+
+# Celery stuff
+celerybeat-schedule
+celerybeat.pid
+
+# SageMath parsed files
+*.sage.py
+
+# Environments
+.env
+.venv
+env/
+venv/
+ENV/
+env.bak/
+venv.bak/
+
+# Spyder project settings
+.spyderproject
+.spyproject
+
+# Rope project settings
+.ropeproject
+
+# mkdocs documentation
+/site
+
+# mypy
+.mypy_cache/
+.dmypy.json
+dmypy.json
+
+# Pyre type checker
+.pyre/
+
+# IntelliJ
+.idea/
+
+# VS Code
+.vscode/
diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
new file mode 100644
index 0000000..9c9cf2f
--- /dev/null
+++ b/.pre-commit-config.yaml
@@ -0,0 +1,58 @@
+repos:
+- repo: https://github.com/Lucas-C/pre-commit-hooks
+ rev: 79b8e4f273301e412602c856ddbc0c066765c98c # frozen: v1.1.11
+ hooks:
+ - id: insert-license
+ files: '^src/.+\.py$|^tests/.+\.py$'
+ args: ['--license-filepath', 'LICENSE-HEADER']
+- repo: https://github.com/executablebooks/mdformat
+ rev: a5f167d00d7a1990e69ee02efacc15d6136ea1aa # frozen: 0.7.13
+ hooks:
+ - id: mdformat
+ additional_dependencies:
+ - mdformat-toc
+ - mdformat-gfm
+ - mdformat-black
+- repo: https://github.com/asottile/yesqa
+ rev: 35cf7dc24fa922927caded7a21b2a8cb04bf8e10 # frozen: v1.3.0
+ hooks:
+ - id: yesqa
+ additional_dependencies:
+ - flake8-bugbear
+ - flake8-builtins
+ - flake8-comprehensions
+- repo: https://github.com/PyCQA/isort
+ rev: c5e8fa75dda5f764d20f66a215d71c21cfa198e1 # frozen: 5.10.1
+ hooks:
+ - id: isort
+- repo: https://github.com/psf/black
+ rev: fc0be6eb1e2a96091e6f64009ee5e9081bf8b6c6 # frozen: 22.1.0
+ hooks:
+ - id: black
+- repo: https://github.com/myint/docformatter
+ rev: 67919ee01837761f2d954d7fbb08c12cdd38ec5a # frozen: v1.4
+ hooks:
+ - id: docformatter
+- repo: https://github.com/pre-commit/pre-commit-hooks
+ rev: 8fe62d14e0b4d7d845a7022c5c2c3ae41bdd3f26 # frozen: v4.1.0
+ hooks:
+ - id: check-yaml
+- repo: https://github.com/pre-commit/pygrep-hooks
+ rev: 6f51a66bba59954917140ec2eeeaa4d5e630e6ce # frozen: v1.9.0
+ hooks:
+ - id: python-use-type-annotations
+ - id: python-check-blanket-noqa
+ - id: python-check-blanket-type-ignore
+- repo: https://github.com/PyCQA/flake8
+ rev: cbeb4c9c4137cff1568659fcc48e8b85cddd0c8d # frozen: 4.0.1
+ hooks:
+ - id: flake8
+ additional_dependencies:
+ - flake8-bugbear
+ - flake8-builtins
+ - flake8-comprehensions
+- repo: https://github.com/pre-commit/mirrors-mypy
+ rev: f6f816c65d285f8a4a15e0e9965b3dd66ecddd79 # frozen: v0.931
+ hooks:
+ - id: mypy
+ args: ["--scripts-are-modules"]
diff --git a/CHANGELOG.md b/CHANGELOG.md
new file mode 100644
index 0000000..ba430cb
--- /dev/null
+++ b/CHANGELOG.md
@@ -0,0 +1,161 @@
+# Changelog
+
+## 2.0.1
+
+- Improve
+ - Make bundling easier by using relative imports internally and adding license and copyright notice to source files.
+ - Make error messages more uniform
+ - Raise a friendly `TypeError` for wrong file mode
+ - Allow `parse_float` to return objects having the `append` attr
+ - Eagerly raise an error if `parse_float` returns an illegal type
+- Packaging
+ - Move from `pytest` testing framework to `unittest` and remove `python-dateutil` test dependency.
+ Tests now only require Python interpreter.
+
+## 1.2.3
+
+- Fixed
+ - Backport: Allow lower case "t" and "z" in datetimes
+
+## 2.0.0
+
+- Removed
+ - Python 3.6 support
+ - Support for text file objects as `load` input. Use binary file objects instead.
+ - First argument of `load` and `loads` can no longer be passed by keyword.
+- Fixed
+ - Allow lower case "t" and "z" in datetimes
+- Improved
+ - Raise an error when dotted keys define values outside the "current table".
+ Technically speaking TOML v1.0.0 does allow such assignments
+ but that isn't intended by specification writers,
+ and will change in a future specification version (see the [pull request](https://github.com/toml-lang/toml/pull/848)).
+
+## 1.2.2
+
+- Fixed
+ - Illegal characters in error messages were surrounded by two pairs of quotation marks
+- Improved
+ - `TOMLDecodeError.__module__` is now the public import path (`tomli`) instead of private import path (`tomli._parser`)
+ - Eliminated an import cycle when `typing.TYPE_CHECKING` is `True`.
+ This allows `sphinx-autodoc-typehints` to resolve type annotations.
+
+## 1.2.1
+
+- Fixed
+ - Raise an error if a carriage return (without a following line feed) is found in a multi-line basic string
+- Type annotations
+ - Type annotate `load` input as `typing.BinaryIO` only to discourage use of deprecated text file objects.
+- Packaging
+ - Remove legacy `setup.py` from PyPI source distribution.
+ If you're a packager and absolutely need this file, please create an issue.
+
+## 1.2.0
+
+- Deprecated
+ - Text file objects as input to `load`.
+ Binary file objects should be used instead to avoid opening a TOML file with universal newlines or with an encoding other than UTF-8.
+
+## 1.1.0
+
+- Added
+ - `load` can now take a binary file object
+
+## 1.0.4
+
+- Performance
+ - Minor boost (~4%)
+
+## 1.0.3
+
+- Fixed
+ - Raise `TOMLDecodeError` instead of `ValueError` when parsing dates and datetimes that pass the regex check but don't correspond to a valid date or datetime.
+- Performance
+ - Improved multiline literal string parsing performance
+
+## 1.0.2
+
+- Performance
+ - Minor boost (~4%)
+
+## 1.0.1
+
+- Performance
+ - A significant boost
+
+## 1.0.0
+
+- Fixed
+ - Raise `TOMLDecodeError` instead of `KeyError` when overwriting implicitly in an inline table
+
+## 0.2.10
+
+- Fixed
+ - Raise `TOMLDecodeError` if overwriting nested inline tables from the parent inline
+ - Raise `TOMLDecodeError` if escaped Unicode character is not a Unicode scalar value
+- Performance
+ - Increased parsing speed of single line basic strings, and multi-line literal and basic strings
+
+## 0.2.9
+
+- Fixed
+ - `TOMLDecodeError` now raised when opening a table implicitly created by a key/value pair
+ - Don't error when two array-of-tables items open a subtable with the same name
+ - Don't error when opening parent table of an already defined array-of-tables item
+
+## 0.2.8
+
+- Performance
+ - Significant boost to comment parsing speed
+
+## 0.2.7
+
+- Added
+ - Improved `TOMLDecodeError` error messages.
+ Line and column are included when applicable.
+
+## 0.2.6
+
+- Performance
+ - Over 5% boost
+
+## 0.2.5
+
+- Fixed
+ - Made exception type `TOMLDecodeError` when overwriting a value with a deeply nested table
+
+## 0.2.4
+
+- Fixed
+ - `TOMLDecodeError` is now raised when attempting to overwrite a value in an inline table's or array's namespace with a table definition
+
+## 0.2.3
+
+- Fixed
+ - Error type was not TOMLDecodeError in some obscure cases
+
+## 0.2.2
+
+- Added
+ - `tomli.load` for parsing IO streams returned by `open()`
+ - `parse_float` keyword argument to `tomli.loads`.
+ Allows parsing TOML floats to a non-float type in Python.
+
+## 0.2.1
+
+- Fixed
+ - `TOMLDecodeError` is now raised for duplicate keys in inline tables,
+ as opposed to silently overriding the previous value
+
+## 0.2.0
+
+- Changed
+ - Project name to Tomli
+- Performance
+ - A performance boost
+
+## 0.1.0
+
+- Added
+ - `tomli.loads` for parsing TOML strings
+ - `tomli.TOMLDecodeError` that is raised for parse errors
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..e859590
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2021 Taneli Hukkinen
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/LICENSE-HEADER b/LICENSE-HEADER
new file mode 100644
index 0000000..aba78dd
--- /dev/null
+++ b/LICENSE-HEADER
@@ -0,0 +1,3 @@
+SPDX-License-Identifier: MIT
+SPDX-FileCopyrightText: 2021 Taneli Hukkinen
+Licensed to PSF under a Contributor Agreement.
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..2c856b4
--- /dev/null
+++ b/README.md
@@ -0,0 +1,181 @@
+[![Build Status](https://github.com/hukkin/tomli/workflows/Tests/badge.svg?branch=master)](https://github.com/hukkin/tomli/actions?query=workflow%3ATests+branch%3Amaster+event%3Apush)
+[![codecov.io](https://codecov.io/gh/hukkin/tomli/branch/master/graph/badge.svg)](https://codecov.io/gh/hukkin/tomli)
+[![PyPI version](https://img.shields.io/pypi/v/tomli)](https://pypi.org/project/tomli)
+
+# Tomli
+
+> A lil' TOML parser
+
+**Table of Contents** *generated with [mdformat-toc](https://github.com/hukkin/mdformat-toc)*
+
+<!-- mdformat-toc start --slug=github --maxlevel=6 --minlevel=2 -->
+
+- [Intro](#intro)
+- [Installation](#installation)
+- [Usage](#usage)
+ - [Parse a TOML string](#parse-a-toml-string)
+ - [Parse a TOML file](#parse-a-toml-file)
+ - [Handle invalid TOML](#handle-invalid-toml)
+ - [Construct `decimal.Decimal`s from TOML floats](#construct-decimaldecimals-from-toml-floats)
+- [FAQ](#faq)
+ - [Why this parser?](#why-this-parser)
+ - [Is comment preserving round-trip parsing supported?](#is-comment-preserving-round-trip-parsing-supported)
+ - [Is there a `dumps`, `write` or `encode` function?](#is-there-a-dumps-write-or-encode-function)
+ - [How do TOML types map into Python types?](#how-do-toml-types-map-into-python-types)
+- [Performance](#performance)
+
+<!-- mdformat-toc end -->
+
+## Intro<a name="intro"></a>
+
+Tomli is a Python library for parsing [TOML](https://toml.io).
+Tomli is fully compatible with [TOML v1.0.0](https://toml.io/en/v1.0.0).
+
+## Installation<a name="installation"></a>
+
+```bash
+pip install tomli
+```
+
+## Usage<a name="usage"></a>
+
+### Parse a TOML string<a name="parse-a-toml-string"></a>
+
+```python
+import tomli
+
+toml_str = """
+ gretzky = 99
+
+ [kurri]
+ jari = 17
+ """
+
+toml_dict = tomli.loads(toml_str)
+assert toml_dict == {"gretzky": 99, "kurri": {"jari": 17}}
+```
+
+### Parse a TOML file<a name="parse-a-toml-file"></a>
+
+```python
+import tomli
+
+with open("path_to_file/conf.toml", "rb") as f:
+ toml_dict = tomli.load(f)
+```
+
+The file must be opened in binary mode (with the `"rb"` flag).
+Binary mode will enforce decoding the file as UTF-8 with universal newlines disabled,
+both of which are required to correctly parse TOML.
+
+### Handle invalid TOML<a name="handle-invalid-toml"></a>
+
+```python
+import tomli
+
+try:
+ toml_dict = tomli.loads("]] this is invalid TOML [[")
+except tomli.TOMLDecodeError:
+ print("Yep, definitely not valid.")
+```
+
+Note that error messages are considered informational only.
+They should not be assumed to stay constant across Tomli versions.
+
+### Construct `decimal.Decimal`s from TOML floats<a name="construct-decimaldecimals-from-toml-floats"></a>
+
+```python
+from decimal import Decimal
+import tomli
+
+toml_dict = tomli.loads("precision-matters = 0.982492", parse_float=Decimal)
+assert toml_dict["precision-matters"] == Decimal("0.982492")
+```
+
+Note that `decimal.Decimal` can be replaced with another callable that converts a TOML float from string to a Python type.
+The `decimal.Decimal` is, however, a practical choice for use cases where float inaccuracies can not be tolerated.
+
+Illegal types are `dict` and `list`, and their subtypes.
+A `ValueError` will be raised if `parse_float` produces illegal types.
+
+## FAQ<a name="faq"></a>
+
+### Why this parser?<a name="why-this-parser"></a>
+
+- it's lil'
+- pure Python with zero dependencies
+- the fastest pure Python parser [\*](#performance):
+ 15x as fast as [tomlkit](https://pypi.org/project/tomlkit/),
+ 2.4x as fast as [toml](https://pypi.org/project/toml/)
+- outputs [basic data types](#how-do-toml-types-map-into-python-types) only
+- 100% spec compliant: passes all tests in
+ [a test set](https://github.com/toml-lang/compliance/pull/8)
+ soon to be merged to the official
+ [compliance tests for TOML](https://github.com/toml-lang/compliance)
+ repository
+- thoroughly tested: 100% branch coverage
+
+### Is comment preserving round-trip parsing supported?<a name="is-comment-preserving-round-trip-parsing-supported"></a>
+
+No.
+
+The `tomli.loads` function returns a plain `dict` that is populated with builtin types and types from the standard library only.
+Preserving comments requires a custom type to be returned so will not be supported,
+at least not by the `tomli.loads` and `tomli.load` functions.
+
+Look into [TOML Kit](https://github.com/sdispater/tomlkit) if preservation of style is what you need.
+
+### Is there a `dumps`, `write` or `encode` function?<a name="is-there-a-dumps-write-or-encode-function"></a>
+
+[Tomli-W](https://github.com/hukkin/tomli-w) is the write-only counterpart of Tomli, providing `dump` and `dumps` functions.
+
+The core library does not include write capability, as most TOML use cases are read-only, and Tomli intends to be minimal.
+
+### How do TOML types map into Python types?<a name="how-do-toml-types-map-into-python-types"></a>
+
+| TOML type | Python type | Details |
+| ---------------- | ------------------- | ------------------------------------------------------------ |
+| Document Root | `dict` | |
+| Key | `str` | |
+| String | `str` | |
+| Integer | `int` | |
+| Float | `float` | |
+| Boolean | `bool` | |
+| Offset Date-Time | `datetime.datetime` | `tzinfo` attribute set to an instance of `datetime.timezone` |
+| Local Date-Time | `datetime.datetime` | `tzinfo` attribute set to `None` |
+| Local Date | `datetime.date` | |
+| Local Time | `datetime.time` | |
+| Array | `list` | |
+| Table | `dict` | |
+| Inline Table | `dict` | |
+
+## Performance<a name="performance"></a>
+
+The `benchmark/` folder in this repository contains a performance benchmark for comparing the various Python TOML parsers.
+The benchmark can be run with `tox -e benchmark-pypi`.
+Running the benchmark on my personal computer output the following:
+
+```console
+foo@bar:~/dev/tomli$ tox -e benchmark-pypi
+benchmark-pypi installed: attrs==19.3.0,click==7.1.2,pytomlpp==1.0.2,qtoml==0.3.0,rtoml==0.7.0,toml==0.10.2,tomli==1.1.0,tomlkit==0.7.2
+benchmark-pypi run-test-pre: PYTHONHASHSEED='2658546909'
+benchmark-pypi run-test: commands[0] | python -c 'import datetime; print(datetime.date.today())'
+2021-07-23
+benchmark-pypi run-test: commands[1] | python --version
+Python 3.8.10
+benchmark-pypi run-test: commands[2] | python benchmark/run.py
+Parsing data.toml 5000 times:
+------------------------------------------------------
+ parser | exec time | performance (more is better)
+-----------+------------+-----------------------------
+ rtoml | 0.901 s | baseline (100%)
+ pytomlpp | 1.08 s | 83.15%
+ tomli | 3.89 s | 23.15%
+ toml | 9.36 s | 9.63%
+ qtoml | 11.5 s | 7.82%
+ tomlkit | 56.8 s | 1.59%
+```
+
+The parsers are ordered from fastest to slowest, using the fastest parser as baseline.
+Tomli performed the best out of all pure Python TOML parsers,
+losing only to pytomlpp (wraps C++) and rtoml (wraps Rust).
diff --git a/benchmark/LICENSE b/benchmark/LICENSE
new file mode 100644
index 0000000..cf0aaf5
--- /dev/null
+++ b/benchmark/LICENSE
@@ -0,0 +1,17 @@
+MIT License
+
+Copyright (c) 2020 Bob Fang (bob.fang.london@gmail.com)
+Copyright (c) 2021 Taneli Hukkinen
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated
+documentation files (the "Software"), to deal in the Software without restriction, including without limitation the
+rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the
+Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/benchmark/README.md b/benchmark/README.md
new file mode 100644
index 0000000..5a35172
--- /dev/null
+++ b/benchmark/README.md
@@ -0,0 +1,22 @@
+# Benchmark
+
+## Acknowledgments
+
+This benchmark was shamelessly copied from
+[pytomlpp](https://github.com/bobfang1992/pytomlpp/tree/e6b03726f8347c6a6757f520ad1b5fab68ed8534/benchmark)
+repository and edited.
+Credit goes to the authors of that project.
+
+## Running
+
+### Against the local Tomli state
+
+```bash
+tox -e benchmark
+```
+
+### Against the latest Tomli PyPI release
+
+```bash
+tox -e benchmark-pypi
+```
diff --git a/benchmark/data.toml b/benchmark/data.toml
new file mode 100644
index 0000000..60b7c5b
--- /dev/null
+++ b/benchmark/data.toml
@@ -0,0 +1,128 @@
+addition-used = false
+afraid-boiling-draconian = 1916-12-15T11:26:42+11:26
+boiling-whip = 12:23:17.000129
+charming = 16771
+close-unbecoming = 14:49:02
+contain-terrible-neck = 1928-11-07T06:30:56
+creature = 0.4857
+crowded-profuse-capable = 1932-05-28
+deserted-cross-creature = 1931-12-26T04:31:04
+deserted-heavy = [ 2014-02-08, 1984-03-16, 1910-08-05 ]
+fabulous = 0.3388
+ghost-birds-legal = 1989-09-02
+grandfather-weary = 10216
+haircut-dreary-broken = 'unadvised rejoice lewd crime grandfather rice imperfect'
+harm-snow = 0.6724
+leather-aromatic-rabbit = false
+license-harm = 1987-08-15T15:30:51+03:24
+naughty-self-close = 1916-09-21T01:53:27-02:59
+neck = 29653
+neck-crime-wistful = 1998-12-07
+rest-afraid = [
+ 1912-06-23T07:00:07-07:46, # this is a datetime
+ 1910-11-17T13:10:34, # pretty sure this is also a datetime
+ 2014-08-03T04:37:12-06:36, # and this
+ 1966-11-22T18:08:23+06:10, # and this
+ 1985-03-01T08:11:38, # what about this?
+ 1976-09-04T20:46:46+00:29, # yes that also
+ 1964-05-18T20:13:27-01:25, # ...
+ 1961-10-14T11:03:51.011555+06:23,
+ 2005-07-13T02:57:15-01:46, # wonder how many comments there are typically in
+ 2007-02-01T17:09:54-08:45, # a TOML file of this size
+ 1952-03-06T09:15:04+01:44,
+ 1962-12-25T23:00:11+04:28
+]
+rotten-best = 0.0325
+run-curious = true
+run-meaty = 04:40:20.003312
+scintillating-cream = 0.2604
+sisters-playground = 'week spiritual pause insidious uptight'
+spiritual-borrow-messy = 16:49:32
+surprise-jail-babies = 2008-01-01
+title-unbiased = 1958-10-08
+unbecoming-scene-lewd = true
+worried-spicy = 23:03:54
+
+[contain]
+ghost = 0.2471
+tank-lackadaisical = 1945-02-18T22:22:27+01:41
+
+ [contain.righteous-imperfect-remarkable]
+ ticket = 0.2412
+ voyage = 'prefer silky night draconian three dreary decisive'
+ wilderness-draconian = 04:58:17
+
+ [contain.righteous-imperfect-remarkable.deeply-night-gold]
+ legal = 1981-07-04
+ righteous = [ false, true, false, false, true ]
+ wilderness = 1900-12-24
+
+[crime]
+boiling-excuse-incandescent = 31173
+flat-rejoice = 0.8682
+furtive = 6866
+heavy-memory = 5545
+lackadaisical-terrible-overjoyed = [ 'harm acceptable naughty pause', 'page anxious threatening lewd' ]
+reject-aromatic = [ false, true, true, true, false, true ]
+reject-naughty = 11229
+scintillating-bake-harm = 0.8258
+
+[license-bat]
+adorable-blind-string = 1961-08-14
+bat = 1939-10-28
+blind-wilderness = 2004-07-14
+
+[rapid]
+borrow = true
+jail-weary-furtive = 'room'
+protective-sulky = 4737
+room-decisive-unbiased = 1998-11-01T12:23:58
+soap = 1985-05-06
+sprout-rich = 0.6026
+
+ [rapid.clean-leather]
+ blood-snow-mark = true
+ equable = 0.2923
+ fabulous = 1979-07-24T00:53:39+06:22
+ glorious-threatening = true
+ lewd-dull = 02:40:53.027288
+
+[run-overjoyed]
+creature-cheerful = 11071
+respect-history-anxious = 0.4637
+vessel = 'curious'
+
+[inline-tables]
+table1 ={ the-text-in-this = 'file is weeiiird' , autogenerated-perhaps= 1199999 , subtableee = {blii=false}}
+table2 = { arr = [ { id = 0 }, { id = 1}, { id = 2} ] }
+
+[[dynamic-arrays.products]]
+name = "juusto"
+ [[dynamic-arrays.products]]
+ name = "tee \t\t kannu"
+[[dynamic-arrays.products]]
+name = "\n\nkahvi"
+ [[dynamic-arrays.products]]
+ name = "\"riisi\""
+[[dynamic-arrays.products]]
+name = "puuro \\ riisipuuro"
+
+
+# Fusce sit amet risus vel sapien vestibulum interdum. Aliquam finibus
+# finibus nibh, sed mattis nulla lacinia in. Nunc ac volutpat massa,
+# at fringilla dui. In dignissim pellentesque luctus. Cras ac ex metus.
+# Duis ut molestie augue. Donec vitae nulla massa. Sed blandit diam sit
+# amet mauris posuere consectetur.
+
+[multiline-strings]
+literal-str = '''
+Liirum laarum liirum laarum.
+Liirum laarum liirum laarum.
+Liirum laarum liirum laarum.
+'''
+basic-str = """\
+ Escape whitespace. \
+
+
+ Liirum laarum liirum laarum.\ueeee\U000eeeee\u1234
+"""
diff --git a/benchmark/requirements.txt b/benchmark/requirements.txt
new file mode 100644
index 0000000..2433985
--- /dev/null
+++ b/benchmark/requirements.txt
@@ -0,0 +1,9 @@
+# NOTE
+# Tomli itself is not included here because tox is used to read
+# this file and install the deps, and it handles the Tomli
+# installation separately.
+pytomlpp
+toml
+tomlkit
+qtoml
+rtoml
diff --git a/benchmark/run.py b/benchmark/run.py
new file mode 100644
index 0000000..83a406d
--- /dev/null
+++ b/benchmark/run.py
@@ -0,0 +1,64 @@
+from __future__ import annotations
+
+from collections.abc import Callable
+from pathlib import Path
+import timeit
+
+import pytomlpp
+import qtoml
+import rtoml
+import toml
+import tomlkit
+
+import tomli
+
+
+def benchmark(
+ name: str,
+ run_count: int,
+ func: Callable,
+ col_width: tuple,
+ compare_to: float | None = None,
+) -> float:
+ placeholder = "Running..."
+ print(f"{name:>{col_width[0]}} | {placeholder}", end="", flush=True)
+ time_taken = timeit.timeit(func, number=run_count)
+ print("\b" * len(placeholder), end="")
+ time_suffix = " s"
+ print(f"{time_taken:{col_width[1]-len(time_suffix)}.3g}{time_suffix}", end="")
+ if compare_to is None:
+ print(" | baseline (100%)", end="")
+ else:
+ delta = compare_to / time_taken
+ print(f" | {delta:.2%}", end="")
+ print()
+ return time_taken
+
+
+def run(run_count: int) -> None:
+ data_path = Path(__file__).parent / "data.toml"
+ test_data = data_path.read_bytes().decode()
+
+ # qtoml has a bug making it crash without this newline normalization
+ test_data = test_data.replace("\r\n", "\n")
+
+ col_width = (10, 10, 28)
+ col_head = ("parser", "exec time", "performance (more is better)")
+ print(f"Parsing data.toml {run_count} times:")
+ print("-" * col_width[0] + "---" + "-" * col_width[1] + "---" + col_width[2] * "-")
+ print(
+ f"{col_head[0]:>{col_width[0]}} | {col_head[1]:>{col_width[1]}} | {col_head[2]}"
+ )
+ print("-" * col_width[0] + "-+-" + "-" * col_width[1] + "-+-" + col_width[2] * "-")
+ # fmt: off
+ baseline = benchmark("rtoml", run_count, lambda: rtoml.loads(test_data), col_width) # noqa: E501
+ benchmark("pytomlpp", run_count, lambda: pytomlpp.loads(test_data), col_width, compare_to=baseline) # noqa: E501
+ benchmark("tomli", run_count, lambda: tomli.loads(test_data), col_width, compare_to=baseline) # noqa: E501
+ benchmark("toml", run_count, lambda: toml.loads(test_data), col_width, compare_to=baseline) # noqa: E501
+ benchmark("qtoml", run_count, lambda: qtoml.loads(test_data), col_width, compare_to=baseline) # noqa: E501
+ benchmark("tomlkit", run_count, lambda: tomlkit.parse(test_data), col_width, compare_to=baseline) # noqa: E501
+ # fmt: on
+
+
+if __name__ == "__main__":
+ run(5000)
diff --git a/fuzzer/fuzz.py b/fuzzer/fuzz.py
new file mode 100644
index 0000000..a97b2f7
--- /dev/null
+++ b/fuzzer/fuzz.py
@@ -0,0 +1,79 @@
+import atheris
+
+with atheris.instrument_imports():
+ from math import isnan
+ import sys
+ import warnings
+
+ import tomli_w
+
+ import tomli
+
+# Disable any caching used so that the same lines of code run
+# on a given input consistently.
+tomli._re.cached_tz = tomli._re.cached_tz.__wrapped__
+
+# Suppress all warnings.
+warnings.simplefilter("ignore")
+
+
+def test_one_input(input_bytes: bytes) -> None:
+ # We need a Unicode string, not bytes
+ fdp = atheris.FuzzedDataProvider(input_bytes)
+ data = fdp.ConsumeUnicode(sys.maxsize)
+
+ try:
+ toml_obj = tomli.loads(data)
+ except (tomli.TOMLDecodeError, RecursionError):
+ return
+ except BaseException:
+ print_err(data)
+ raise
+
+ try:
+ recovered_data = tomli_w.dumps(toml_obj)
+ except RecursionError:
+ return
+ except BaseException:
+ print_err(data)
+ raise
+
+ roundtripped_obj = tomli.loads(recovered_data)
+ normalize_toml_obj(roundtripped_obj)
+ normalize_toml_obj(toml_obj)
+ if roundtripped_obj != toml_obj:
+ sys.stderr.write(
+ f"Original dict:\n{toml_obj}\nRoundtripped dict:\n{roundtripped_obj}\n"
+ )
+ sys.stderr.flush()
+ print_err(data)
+ raise Exception("Dicts not equal after roundtrip")
+
+
+def print_err(data):
+ codepoints = [hex(ord(x)) for x in data]
+ sys.stderr.write(f"Input was {type(data)}:\n{data}\nCodepoints:\n{codepoints}\n")
+ sys.stderr.flush()
+
+
+def normalize_toml_obj(toml_obj: dict) -> None:
+ """Make NaNs equal when compared (without using recursion)."""
+ to_process = [toml_obj]
+ while to_process:
+ cont = to_process.pop()
+ for k, v in cont.items() if isinstance(cont, dict) else enumerate(cont):
+ if isinstance(v, float) and isnan(v):
+ cont[k] = "nan"
+ elif isinstance(v, (dict, list)):
+ to_process.append(v)
+
+
+def main():
+ # For possible options, see https://llvm.org/docs/LibFuzzer.html#options
+ fuzzer_options = sys.argv
+ atheris.Setup(fuzzer_options, test_one_input)
+ atheris.Fuzz()
+
+
+if __name__ == "__main__":
+ main()
diff --git a/fuzzer/requirements.txt b/fuzzer/requirements.txt
new file mode 100644
index 0000000..b4d78cc
--- /dev/null
+++ b/fuzzer/requirements.txt
@@ -0,0 +1,4 @@
+# sudo apt-get install clang
+wheel
+atheris==2.0.3
+tomli_w>=0.2.2
diff --git a/profiler/requirements.txt b/profiler/requirements.txt
new file mode 100644
index 0000000..c65a7f7
--- /dev/null
+++ b/profiler/requirements.txt
@@ -0,0 +1 @@
+pytest-profiling
diff --git a/profiler/test_for_profiler.py b/profiler/test_for_profiler.py
new file mode 100644
index 0000000..0d5e079
--- /dev/null
+++ b/profiler/test_for_profiler.py
@@ -0,0 +1,24 @@
+"""Test for profiling.
+
+This test can be useful for profiling, as most of the execution time
+will be spent parsing and rendering instead of managing pytest execution
+environment. To get and read profiler results:
+ - `tox -e profile`
+ - `firefox .tox/prof/combined.svg`
+"""
+import os
+from pathlib import Path
+
+import tomli
+
+
+def test_for_profiler() -> None:
+ path = Path(__file__).parent.parent / "benchmark" / "data.toml"
+ benchmark_toml = path.read_bytes().decode()
+ # increase the count here to reduce the impact of
+ # setting up pytest execution environment. Let's keep
+ # the count low by default because this is part of the
+ # standard test suite.
+ iterations = int(os.environ.get("PROFILER_ITERATIONS", 1))
+ for _ in range(iterations):
+ tomli.loads(benchmark_toml)
diff --git a/pyproject.toml b/pyproject.toml
new file mode 100644
index 0000000..adcf366
--- /dev/null
+++ b/pyproject.toml
@@ -0,0 +1,157 @@
+[build-system]
+requires = ["flit_core>=3.2.0,<4"]
+build-backend = "flit_core.buildapi"
+
+[project]
+name = "tomli"
+version = "2.0.1" # DO NOT EDIT THIS LINE MANUALLY. LET bump2version UTILITY DO IT
+description = "A lil' TOML parser"
+authors = [
+ { name = "Taneli Hukkinen", email = "hukkin@users.noreply.github.com" },
+]
+license = { file = "LICENSE" }
+requires-python = ">=3.7"
+readme = "README.md"
+classifiers = [
+ "License :: OSI Approved :: MIT License",
+ "Operating System :: MacOS",
+ "Operating System :: Microsoft :: Windows",
+ "Operating System :: POSIX :: Linux",
+ "Programming Language :: Python :: 3 :: Only",
+ "Programming Language :: Python :: 3.7",
+ "Programming Language :: Python :: 3.8",
+ "Programming Language :: Python :: 3.9",
+ "Programming Language :: Python :: 3.10",
+ "Programming Language :: Python :: Implementation :: CPython",
+ "Programming Language :: Python :: Implementation :: PyPy",
+ "Topic :: Software Development :: Libraries :: Python Modules",
+ "Typing :: Typed",
+]
+keywords = ["toml"]
+
+[project.urls]
+"Homepage" = "https://github.com/hukkin/tomli"
+"Changelog" = "https://github.com/hukkin/tomli/blob/master/CHANGELOG.md"
+
+
+[tool.isort]
+# Force imports to be sorted by module, independent of import type
+force_sort_within_sections = true
+# Group first party and local folder imports together
+no_lines_before = ["LOCALFOLDER"]
+
+# Configure isort to work without access to site-packages
+known_first_party = ["tomli", "tests"]
+
+# Settings for Black compatibility
+profile = "black"
+
+
+[tool.tox]
+legacy_tox_ini = '''
+[tox]
+# Only run unittest envs when no args given to tox
+envlist = py{37,38,39,310}
+isolated_build = True
+
+[testenv:py{37,38,39,310}]
+description = run tests against a built package
+commands =
+ python -m unittest {posargs}
+
+[testenv:profile]
+description = run profiler (use e.g. `firefox .tox/prof/combined.svg` to open)
+setenv =
+ PROFILER_ITERATIONS=1000
+deps =
+ -r profiler/requirements.txt
+commands =
+ pytest profiler/test_for_profiler.py --profile-svg --pstats-dir "{toxworkdir}/prof"
+ python -c 'import pathlib; print("profiler svg output under file://\{0\}".format(pathlib.Path(r"{toxworkdir}") / "prof" / "combined.svg"))'
+
+[testenv:pre-commit]
+description = run linters
+skip_install = True
+deps = pre-commit
+commands = pre-commit run {posargs:--all}
+
+[testenv:benchmark]
+description = run the benchmark script against a local Tomli version
+deps =
+ -r benchmark/requirements.txt
+commands =
+ python -c 'import datetime; print(datetime.date.today())'
+ python --version
+ python benchmark/run.py
+
+[testenv:benchmark-pypi]
+description = run the benchmark script against the latest Tomli in PyPI
+skip_install = True
+deps =
+ tomli
+ -r benchmark/requirements.txt
+commands =
+ python -c 'import datetime; print(datetime.date.today())'
+ python --version
+ python benchmark/run.py
+
+[testenv:fuzz]
+description = run the fuzzer against a local Tomli version (needs "apt install clang")
+deps =
+ -r fuzzer/requirements.txt
+allowlist_externals =
+ mkdir
+ cp
+commands =
+ # Create a folder for persistent corpus and use benchmark data as initial seed
+ mkdir -p {toxworkdir}/fuzzer-corpus
+ cp -n benchmark/data.toml {toxworkdir}/fuzzer-corpus/data.toml
+ # Run fuzzer
+ python fuzzer/fuzz.py {toxworkdir}/fuzzer-corpus {posargs:-len_control=10000}
+'''
+
+
+[tool.coverage.run]
+branch = true
+source = ['tomli']
+
+[tool.coverage.report]
+# Regexes for lines to exclude from consideration
+exclude_lines = [
+ # Re-enable the standard pragma (with extra strictness)
+ '# pragma: no cover\b',
+ # Code for static type checkers
+ 'if TYPE_CHECKING:',
+ # Scripts
+ 'if __name__ == .__main__.:',
+]
+
+
+[tool.mypy]
+show_error_codes = true
+warn_unreachable = true
+warn_unused_ignores = true
+warn_redundant_casts = true
+warn_unused_configs = true
+# Disabling incremental mode is required for `warn_unused_configs = true` to work
+incremental = false
+disallow_untyped_defs = true
+check_untyped_defs = true
+strict_equality = true
+implicit_reexport = false
+no_implicit_optional = true
+
+[[tool.mypy.overrides]]
+module = "tests.*"
+disallow_untyped_defs = false
+
+[[tool.mypy.overrides]]
+# This matches `benchmark/run.py`. Since benchmark/ is
+# not a package, we use the module name here.
+module = "run"
+ignore_errors = true
+
+[[tool.mypy.overrides]]
+# This matches `fuzzer/fuzz.py`.
+module = "fuzz"
+ignore_errors = true
diff --git a/src/tomli/__init__.py b/src/tomli/__init__.py
new file mode 100644
index 0000000..4c6ec97
--- /dev/null
+++ b/src/tomli/__init__.py
@@ -0,0 +1,11 @@
+# SPDX-License-Identifier: MIT
+# SPDX-FileCopyrightText: 2021 Taneli Hukkinen
+# Licensed to PSF under a Contributor Agreement.
+
+__all__ = ("loads", "load", "TOMLDecodeError")
+__version__ = "2.0.1" # DO NOT EDIT THIS LINE MANUALLY. LET bump2version UTILITY DO IT
+
+from ._parser import TOMLDecodeError, load, loads
+
+# Pretend this exception was created here.
+TOMLDecodeError.__module__ = __name__
diff --git a/src/tomli/_parser.py b/src/tomli/_parser.py
new file mode 100644
index 0000000..f1bb0aa
--- /dev/null
+++ b/src/tomli/_parser.py
@@ -0,0 +1,691 @@
+# SPDX-License-Identifier: MIT
+# SPDX-FileCopyrightText: 2021 Taneli Hukkinen
+# Licensed to PSF under a Contributor Agreement.
+
+from __future__ import annotations
+
+from collections.abc import Iterable
+import string
+from types import MappingProxyType
+from typing import Any, BinaryIO, NamedTuple
+
+from ._re import (
+ RE_DATETIME,
+ RE_LOCALTIME,
+ RE_NUMBER,
+ match_to_datetime,
+ match_to_localtime,
+ match_to_number,
+)
+from ._types import Key, ParseFloat, Pos
+
+ASCII_CTRL = frozenset(chr(i) for i in range(32)) | frozenset(chr(127))
+
+# Neither of these sets include quotation mark or backslash. They are
+# currently handled as separate cases in the parser functions.
+ILLEGAL_BASIC_STR_CHARS = ASCII_CTRL - frozenset("\t")
+ILLEGAL_MULTILINE_BASIC_STR_CHARS = ASCII_CTRL - frozenset("\t\n")
+
+ILLEGAL_LITERAL_STR_CHARS = ILLEGAL_BASIC_STR_CHARS
+ILLEGAL_MULTILINE_LITERAL_STR_CHARS = ILLEGAL_MULTILINE_BASIC_STR_CHARS
+
+ILLEGAL_COMMENT_CHARS = ILLEGAL_BASIC_STR_CHARS
+
+TOML_WS = frozenset(" \t")
+TOML_WS_AND_NEWLINE = TOML_WS | frozenset("\n")
+BARE_KEY_CHARS = frozenset(string.ascii_letters + string.digits + "-_")
+KEY_INITIAL_CHARS = BARE_KEY_CHARS | frozenset("\"'")
+HEXDIGIT_CHARS = frozenset(string.hexdigits)
+
+BASIC_STR_ESCAPE_REPLACEMENTS = MappingProxyType(
+ {
+ "\\b": "\u0008", # backspace
+ "\\t": "\u0009", # tab
+ "\\n": "\u000A", # linefeed
+ "\\f": "\u000C", # form feed
+ "\\r": "\u000D", # carriage return
+ '\\"': "\u0022", # quote
+ "\\\\": "\u005C", # backslash
+ }
+)
+
+
+class TOMLDecodeError(ValueError):
+ """An error raised if a document is not valid TOML."""
+
+
+def load(__fp: BinaryIO, *, parse_float: ParseFloat = float) -> dict[str, Any]:
+ """Parse TOML from a binary file object."""
+ b = __fp.read()
+ try:
+ s = b.decode()
+ except AttributeError:
+ raise TypeError(
+ "File must be opened in binary mode, e.g. use `open('foo.toml', 'rb')`"
+ ) from None
+ return loads(s, parse_float=parse_float)
+
+
+def loads(__s: str, *, parse_float: ParseFloat = float) -> dict[str, Any]: # noqa: C901
+ """Parse TOML from a string."""
+
+ # The spec allows converting "\r\n" to "\n", even in string
+ # literals. Let's do so to simplify parsing.
+ src = __s.replace("\r\n", "\n")
+ pos = 0
+ out = Output(NestedDict(), Flags())
+ header: Key = ()
+ parse_float = make_safe_parse_float(parse_float)
+
+ # Parse one statement at a time
+ # (typically means one line in TOML source)
+ while True:
+ # 1. Skip line leading whitespace
+ pos = skip_chars(src, pos, TOML_WS)
+
+ # 2. Parse rules. Expect one of the following:
+ # - end of file
+ # - end of line
+ # - comment
+ # - key/value pair
+ # - append dict to list (and move to its namespace)
+ # - create dict (and move to its namespace)
+ # Skip trailing whitespace when applicable.
+ try:
+ char = src[pos]
+ except IndexError:
+ break
+ if char == "\n":
+ pos += 1
+ continue
+ if char in KEY_INITIAL_CHARS:
+ pos = key_value_rule(src, pos, out, header, parse_float)
+ pos = skip_chars(src, pos, TOML_WS)
+ elif char == "[":
+ try:
+ second_char: str | None = src[pos + 1]
+ except IndexError:
+ second_char = None
+ out.flags.finalize_pending()
+ if second_char == "[":
+ pos, header = create_list_rule(src, pos, out)
+ else:
+ pos, header = create_dict_rule(src, pos, out)
+ pos = skip_chars(src, pos, TOML_WS)
+ elif char != "#":
+ raise suffixed_err(src, pos, "Invalid statement")
+
+ # 3. Skip comment
+ pos = skip_comment(src, pos)
+
+ # 4. Expect end of line or end of file
+ try:
+ char = src[pos]
+ except IndexError:
+ break
+ if char != "\n":
+ raise suffixed_err(
+ src, pos, "Expected newline or end of document after a statement"
+ )
+ pos += 1
+
+ return out.data.dict
+
+
+class Flags:
+ """Flags that map to parsed keys/namespaces."""
+
+ # Marks an immutable namespace (inline array or inline table).
+ FROZEN = 0
+ # Marks a nest that has been explicitly created and can no longer
+ # be opened using the "[table]" syntax.
+ EXPLICIT_NEST = 1
+
+ def __init__(self) -> None:
+ self._flags: dict[str, dict] = {}
+ self._pending_flags: set[tuple[Key, int]] = set()
+
+ def add_pending(self, key: Key, flag: int) -> None:
+ self._pending_flags.add((key, flag))
+
+ def finalize_pending(self) -> None:
+ for key, flag in self._pending_flags:
+ self.set(key, flag, recursive=False)
+ self._pending_flags.clear()
+
+ def unset_all(self, key: Key) -> None:
+ cont = self._flags
+ for k in key[:-1]:
+ if k not in cont:
+ return
+ cont = cont[k]["nested"]
+ cont.pop(key[-1], None)
+
+ def set(self, key: Key, flag: int, *, recursive: bool) -> None: # noqa: A003
+ cont = self._flags
+ key_parent, key_stem = key[:-1], key[-1]
+ for k in key_parent:
+ if k not in cont:
+ cont[k] = {"flags": set(), "recursive_flags": set(), "nested": {}}
+ cont = cont[k]["nested"]
+ if key_stem not in cont:
+ cont[key_stem] = {"flags": set(), "recursive_flags": set(), "nested": {}}
+ cont[key_stem]["recursive_flags" if recursive else "flags"].add(flag)
+
+ def is_(self, key: Key, flag: int) -> bool:
+ if not key:
+ return False # document root has no flags
+ cont = self._flags
+ for k in key[:-1]:
+ if k not in cont:
+ return False
+ inner_cont = cont[k]
+ if flag in inner_cont["recursive_flags"]:
+ return True
+ cont = inner_cont["nested"]
+ key_stem = key[-1]
+ if key_stem in cont:
+ cont = cont[key_stem]
+ return flag in cont["flags"] or flag in cont["recursive_flags"]
+ return False
+
+
+class NestedDict:
+ def __init__(self) -> None:
+ # The parsed content of the TOML document
+ self.dict: dict[str, Any] = {}
+
+ def get_or_create_nest(
+ self,
+ key: Key,
+ *,
+ access_lists: bool = True,
+ ) -> dict:
+ cont: Any = self.dict
+ for k in key:
+ if k not in cont:
+ cont[k] = {}
+ cont = cont[k]
+ if access_lists and isinstance(cont, list):
+ cont = cont[-1]
+ if not isinstance(cont, dict):
+ raise KeyError("There is no nest behind this key")
+ return cont
+
+ def append_nest_to_list(self, key: Key) -> None:
+ cont = self.get_or_create_nest(key[:-1])
+ last_key = key[-1]
+ if last_key in cont:
+ list_ = cont[last_key]
+ if not isinstance(list_, list):
+ raise KeyError("An object other than list found behind this key")
+ list_.append({})
+ else:
+ cont[last_key] = [{}]
+
+
+class Output(NamedTuple):
+ data: NestedDict
+ flags: Flags
+
+
+def skip_chars(src: str, pos: Pos, chars: Iterable[str]) -> Pos:
+ try:
+ while src[pos] in chars:
+ pos += 1
+ except IndexError:
+ pass
+ return pos
+
+
+def skip_until(
+ src: str,
+ pos: Pos,
+ expect: str,
+ *,
+ error_on: frozenset[str],
+ error_on_eof: bool,
+) -> Pos:
+ try:
+ new_pos = src.index(expect, pos)
+ except ValueError:
+ new_pos = len(src)
+ if error_on_eof:
+ raise suffixed_err(src, new_pos, f"Expected {expect!r}") from None
+
+ if not error_on.isdisjoint(src[pos:new_pos]):
+ while src[pos] not in error_on:
+ pos += 1
+ raise suffixed_err(src, pos, f"Found invalid character {src[pos]!r}")
+ return new_pos
+
+
+def skip_comment(src: str, pos: Pos) -> Pos:
+ try:
+ char: str | None = src[pos]
+ except IndexError:
+ char = None
+ if char == "#":
+ return skip_until(
+ src, pos + 1, "\n", error_on=ILLEGAL_COMMENT_CHARS, error_on_eof=False
+ )
+ return pos
+
+
+def skip_comments_and_array_ws(src: str, pos: Pos) -> Pos:
+ while True:
+ pos_before_skip = pos
+ pos = skip_chars(src, pos, TOML_WS_AND_NEWLINE)
+ pos = skip_comment(src, pos)
+ if pos == pos_before_skip:
+ return pos
+
+
+def create_dict_rule(src: str, pos: Pos, out: Output) -> tuple[Pos, Key]:
+ pos += 1 # Skip "["
+ pos = skip_chars(src, pos, TOML_WS)
+ pos, key = parse_key(src, pos)
+
+ if out.flags.is_(key, Flags.EXPLICIT_NEST) or out.flags.is_(key, Flags.FROZEN):
+ raise suffixed_err(src, pos, f"Cannot declare {key} twice")
+ out.flags.set(key, Flags.EXPLICIT_NEST, recursive=False)
+ try:
+ out.data.get_or_create_nest(key)
+ except KeyError:
+ raise suffixed_err(src, pos, "Cannot overwrite a value") from None
+
+ if not src.startswith("]", pos):
+ raise suffixed_err(src, pos, "Expected ']' at the end of a table declaration")
+ return pos + 1, key
+
+
+def create_list_rule(src: str, pos: Pos, out: Output) -> tuple[Pos, Key]:
+ pos += 2 # Skip "[["
+ pos = skip_chars(src, pos, TOML_WS)
+ pos, key = parse_key(src, pos)
+
+ if out.flags.is_(key, Flags.FROZEN):
+ raise suffixed_err(src, pos, f"Cannot mutate immutable namespace {key}")
+ # Free the namespace now that it points to another empty list item...
+ out.flags.unset_all(key)
+ # ...but this key precisely is still prohibited from table declaration
+ out.flags.set(key, Flags.EXPLICIT_NEST, recursive=False)
+ try:
+ out.data.append_nest_to_list(key)
+ except KeyError:
+ raise suffixed_err(src, pos, "Cannot overwrite a value") from None
+
+ if not src.startswith("]]", pos):
+ raise suffixed_err(src, pos, "Expected ']]' at the end of an array declaration")
+ return pos + 2, key
+
+
+def key_value_rule(
+ src: str, pos: Pos, out: Output, header: Key, parse_float: ParseFloat
+) -> Pos:
+ pos, key, value = parse_key_value_pair(src, pos, parse_float)
+ key_parent, key_stem = key[:-1], key[-1]
+ abs_key_parent = header + key_parent
+
+ relative_path_cont_keys = (header + key[:i] for i in range(1, len(key)))
+ for cont_key in relative_path_cont_keys:
+ # Check that dotted key syntax does not redefine an existing table
+ if out.flags.is_(cont_key, Flags.EXPLICIT_NEST):
+ raise suffixed_err(src, pos, f"Cannot redefine namespace {cont_key}")
+ # Containers in the relative path can't be opened with the table syntax or
+ # dotted key/value syntax in following table sections.
+ out.flags.add_pending(cont_key, Flags.EXPLICIT_NEST)
+
+ if out.flags.is_(abs_key_parent, Flags.FROZEN):
+ raise suffixed_err(
+ src, pos, f"Cannot mutate immutable namespace {abs_key_parent}"
+ )
+
+ try:
+ nest = out.data.get_or_create_nest(abs_key_parent)
+ except KeyError:
+ raise suffixed_err(src, pos, "Cannot overwrite a value") from None
+ if key_stem in nest:
+ raise suffixed_err(src, pos, "Cannot overwrite a value")
+ # Mark inline table and array namespaces recursively immutable
+ if isinstance(value, (dict, list)):
+ out.flags.set(header + key, Flags.FROZEN, recursive=True)
+ nest[key_stem] = value
+ return pos
+
+
+def parse_key_value_pair(
+ src: str, pos: Pos, parse_float: ParseFloat
+) -> tuple[Pos, Key, Any]:
+ pos, key = parse_key(src, pos)
+ try:
+ char: str | None = src[pos]
+ except IndexError:
+ char = None
+ if char != "=":
+ raise suffixed_err(src, pos, "Expected '=' after a key in a key/value pair")
+ pos += 1
+ pos = skip_chars(src, pos, TOML_WS)
+ pos, value = parse_value(src, pos, parse_float)
+ return pos, key, value
+
+
+def parse_key(src: str, pos: Pos) -> tuple[Pos, Key]:
+ pos, key_part = parse_key_part(src, pos)
+ key: Key = (key_part,)
+ pos = skip_chars(src, pos, TOML_WS)
+ while True:
+ try:
+ char: str | None = src[pos]
+ except IndexError:
+ char = None
+ if char != ".":
+ return pos, key
+ pos += 1
+ pos = skip_chars(src, pos, TOML_WS)
+ pos, key_part = parse_key_part(src, pos)
+ key += (key_part,)
+ pos = skip_chars(src, pos, TOML_WS)
+
+
+def parse_key_part(src: str, pos: Pos) -> tuple[Pos, str]:
+ try:
+ char: str | None = src[pos]
+ except IndexError:
+ char = None
+ if char in BARE_KEY_CHARS:
+ start_pos = pos
+ pos = skip_chars(src, pos, BARE_KEY_CHARS)
+ return pos, src[start_pos:pos]
+ if char == "'":
+ return parse_literal_str(src, pos)
+ if char == '"':
+ return parse_one_line_basic_str(src, pos)
+ raise suffixed_err(src, pos, "Invalid initial character for a key part")
+
+
+def parse_one_line_basic_str(src: str, pos: Pos) -> tuple[Pos, str]:
+ pos += 1
+ return parse_basic_str(src, pos, multiline=False)
+
+
+def parse_array(src: str, pos: Pos, parse_float: ParseFloat) -> tuple[Pos, list]:
+ pos += 1
+ array: list = []
+
+ pos = skip_comments_and_array_ws(src, pos)
+ if src.startswith("]", pos):
+ return pos + 1, array
+ while True:
+ pos, val = parse_value(src, pos, parse_float)
+ array.append(val)
+ pos = skip_comments_and_array_ws(src, pos)
+
+ c = src[pos : pos + 1]
+ if c == "]":
+ return pos + 1, array
+ if c != ",":
+ raise suffixed_err(src, pos, "Unclosed array")
+ pos += 1
+
+ pos = skip_comments_and_array_ws(src, pos)
+ if src.startswith("]", pos):
+ return pos + 1, array
+
+
+def parse_inline_table(src: str, pos: Pos, parse_float: ParseFloat) -> tuple[Pos, dict]:
+ pos += 1
+ nested_dict = NestedDict()
+ flags = Flags()
+
+ pos = skip_chars(src, pos, TOML_WS)
+ if src.startswith("}", pos):
+ return pos + 1, nested_dict.dict
+ while True:
+ pos, key, value = parse_key_value_pair(src, pos, parse_float)
+ key_parent, key_stem = key[:-1], key[-1]
+ if flags.is_(key, Flags.FROZEN):
+ raise suffixed_err(src, pos, f"Cannot mutate immutable namespace {key}")
+ try:
+ nest = nested_dict.get_or_create_nest(key_parent, access_lists=False)
+ except KeyError:
+ raise suffixed_err(src, pos, "Cannot overwrite a value") from None
+ if key_stem in nest:
+ raise suffixed_err(src, pos, f"Duplicate inline table key {key_stem!r}")
+ nest[key_stem] = value
+ pos = skip_chars(src, pos, TOML_WS)
+ c = src[pos : pos + 1]
+ if c == "}":
+ return pos + 1, nested_dict.dict
+ if c != ",":
+ raise suffixed_err(src, pos, "Unclosed inline table")
+ if isinstance(value, (dict, list)):
+ flags.set(key, Flags.FROZEN, recursive=True)
+ pos += 1
+ pos = skip_chars(src, pos, TOML_WS)
+
+
+def parse_basic_str_escape(
+ src: str, pos: Pos, *, multiline: bool = False
+) -> tuple[Pos, str]:
+ escape_id = src[pos : pos + 2]
+ pos += 2
+ if multiline and escape_id in {"\\ ", "\\\t", "\\\n"}:
+ # Skip whitespace until next non-whitespace character or end of
+ # the doc. Error if non-whitespace is found before newline.
+ if escape_id != "\\\n":
+ pos = skip_chars(src, pos, TOML_WS)
+ try:
+ char = src[pos]
+ except IndexError:
+ return pos, ""
+ if char != "\n":
+ raise suffixed_err(src, pos, "Unescaped '\\' in a string")
+ pos += 1
+ pos = skip_chars(src, pos, TOML_WS_AND_NEWLINE)
+ return pos, ""
+ if escape_id == "\\u":
+ return parse_hex_char(src, pos, 4)
+ if escape_id == "\\U":
+ return parse_hex_char(src, pos, 8)
+ try:
+ return pos, BASIC_STR_ESCAPE_REPLACEMENTS[escape_id]
+ except KeyError:
+ raise suffixed_err(src, pos, "Unescaped '\\' in a string") from None
+
+
+def parse_basic_str_escape_multiline(src: str, pos: Pos) -> tuple[Pos, str]:
+ return parse_basic_str_escape(src, pos, multiline=True)
+
+
+def parse_hex_char(src: str, pos: Pos, hex_len: int) -> tuple[Pos, str]:
+ hex_str = src[pos : pos + hex_len]
+ if len(hex_str) != hex_len or not HEXDIGIT_CHARS.issuperset(hex_str):
+ raise suffixed_err(src, pos, "Invalid hex value")
+ pos += hex_len
+ hex_int = int(hex_str, 16)
+ if not is_unicode_scalar_value(hex_int):
+ raise suffixed_err(src, pos, "Escaped character is not a Unicode scalar value")
+ return pos, chr(hex_int)
+
+
+def parse_literal_str(src: str, pos: Pos) -> tuple[Pos, str]:
+ pos += 1 # Skip starting apostrophe
+ start_pos = pos
+ pos = skip_until(
+ src, pos, "'", error_on=ILLEGAL_LITERAL_STR_CHARS, error_on_eof=True
+ )
+ return pos + 1, src[start_pos:pos] # Skip ending apostrophe
+
+
+def parse_multiline_str(src: str, pos: Pos, *, literal: bool) -> tuple[Pos, str]:
+ pos += 3
+ if src.startswith("\n", pos):
+ pos += 1
+
+ if literal:
+ delim = "'"
+ end_pos = skip_until(
+ src,
+ pos,
+ "'''",
+ error_on=ILLEGAL_MULTILINE_LITERAL_STR_CHARS,
+ error_on_eof=True,
+ )
+ result = src[pos:end_pos]
+ pos = end_pos + 3
+ else:
+ delim = '"'
+ pos, result = parse_basic_str(src, pos, multiline=True)
+
+ # Add at maximum two extra apostrophes/quotes if the end sequence
+ # is 4 or 5 chars long instead of just 3.
+ if not src.startswith(delim, pos):
+ return pos, result
+ pos += 1
+ if not src.startswith(delim, pos):
+ return pos, result + delim
+ pos += 1
+ return pos, result + (delim * 2)
+
+
+def parse_basic_str(src: str, pos: Pos, *, multiline: bool) -> tuple[Pos, str]:
+ if multiline:
+ error_on = ILLEGAL_MULTILINE_BASIC_STR_CHARS
+ parse_escapes = parse_basic_str_escape_multiline
+ else:
+ error_on = ILLEGAL_BASIC_STR_CHARS
+ parse_escapes = parse_basic_str_escape
+ result = ""
+ start_pos = pos
+ while True:
+ try:
+ char = src[pos]
+ except IndexError:
+ raise suffixed_err(src, pos, "Unterminated string") from None
+ if char == '"':
+ if not multiline:
+ return pos + 1, result + src[start_pos:pos]
+ if src.startswith('"""', pos):
+ return pos + 3, result + src[start_pos:pos]
+ pos += 1
+ continue
+ if char == "\\":
+ result += src[start_pos:pos]
+ pos, parsed_escape = parse_escapes(src, pos)
+ result += parsed_escape
+ start_pos = pos
+ continue
+ if char in error_on:
+ raise suffixed_err(src, pos, f"Illegal character {char!r}")
+ pos += 1
+
+
+def parse_value( # noqa: C901
+ src: str, pos: Pos, parse_float: ParseFloat
+) -> tuple[Pos, Any]:
+ try:
+ char: str | None = src[pos]
+ except IndexError:
+ char = None
+
+ # IMPORTANT: order conditions based on speed of checking and likelihood
+
+ # Basic strings
+ if char == '"':
+ if src.startswith('"""', pos):
+ return parse_multiline_str(src, pos, literal=False)
+ return parse_one_line_basic_str(src, pos)
+
+ # Literal strings
+ if char == "'":
+ if src.startswith("'''", pos):
+ return parse_multiline_str(src, pos, literal=True)
+ return parse_literal_str(src, pos)
+
+ # Booleans
+ if char == "t":
+ if src.startswith("true", pos):
+ return pos + 4, True
+ if char == "f":
+ if src.startswith("false", pos):
+ return pos + 5, False
+
+ # Arrays
+ if char == "[":
+ return parse_array(src, pos, parse_float)
+
+ # Inline tables
+ if char == "{":
+ return parse_inline_table(src, pos, parse_float)
+
+ # Dates and times
+ datetime_match = RE_DATETIME.match(src, pos)
+ if datetime_match:
+ try:
+ datetime_obj = match_to_datetime(datetime_match)
+ except ValueError as e:
+ raise suffixed_err(src, pos, "Invalid date or datetime") from e
+ return datetime_match.end(), datetime_obj
+ localtime_match = RE_LOCALTIME.match(src, pos)
+ if localtime_match:
+ return localtime_match.end(), match_to_localtime(localtime_match)
+
+ # Integers and "normal" floats.
+ # The regex will greedily match any type starting with a decimal
+ # char, so needs to be located after handling of dates and times.
+ number_match = RE_NUMBER.match(src, pos)
+ if number_match:
+ return number_match.end(), match_to_number(number_match, parse_float)
+
+ # Special floats
+ first_three = src[pos : pos + 3]
+ if first_three in {"inf", "nan"}:
+ return pos + 3, parse_float(first_three)
+ first_four = src[pos : pos + 4]
+ if first_four in {"-inf", "+inf", "-nan", "+nan"}:
+ return pos + 4, parse_float(first_four)
+
+ raise suffixed_err(src, pos, "Invalid value")
+
+
+def suffixed_err(src: str, pos: Pos, msg: str) -> TOMLDecodeError:
+ """Return a `TOMLDecodeError` where error message is suffixed with
+ coordinates in source."""
+
+ def coord_repr(src: str, pos: Pos) -> str:
+ if pos >= len(src):
+ return "end of document"
+ line = src.count("\n", 0, pos) + 1
+ if line == 1:
+ column = pos + 1
+ else:
+ column = pos - src.rindex("\n", 0, pos)
+ return f"line {line}, column {column}"
+
+ return TOMLDecodeError(f"{msg} (at {coord_repr(src, pos)})")
+
+
+def is_unicode_scalar_value(codepoint: int) -> bool:
+ return (0 <= codepoint <= 55295) or (57344 <= codepoint <= 1114111)
+
+
+def make_safe_parse_float(parse_float: ParseFloat) -> ParseFloat:
+ """A decorator to make `parse_float` safe.
+
+ `parse_float` must not return dicts or lists, because these types
+ would be mixed with parsed TOML tables and arrays, thus confusing
+ the parser. The returned decorated callable raises `ValueError`
+ instead of returning illegal types.
+ """
+ # The default `float` callable never returns illegal types. Optimize it.
+ if parse_float is float: # type: ignore[comparison-overlap]
+ return float
+
+ def safe_parse_float(float_str: str) -> Any:
+ float_value = parse_float(float_str)
+ if isinstance(float_value, (dict, list)):
+ raise ValueError("parse_float must not return dicts or lists")
+ return float_value
+
+ return safe_parse_float
diff --git a/src/tomli/_re.py b/src/tomli/_re.py
new file mode 100644
index 0000000..994bb74
--- /dev/null
+++ b/src/tomli/_re.py
@@ -0,0 +1,107 @@
+# SPDX-License-Identifier: MIT
+# SPDX-FileCopyrightText: 2021 Taneli Hukkinen
+# Licensed to PSF under a Contributor Agreement.
+
+from __future__ import annotations
+
+from datetime import date, datetime, time, timedelta, timezone, tzinfo
+from functools import lru_cache
+import re
+from typing import Any
+
+from ._types import ParseFloat
+
+# E.g.
+# - 00:32:00.999999
+# - 00:32:00
+_TIME_RE_STR = r"([01][0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9])(?:\.([0-9]{1,6})[0-9]*)?"
+
+RE_NUMBER = re.compile(
+ r"""
+0
+(?:
+ x[0-9A-Fa-f](?:_?[0-9A-Fa-f])* # hex
+ |
+ b[01](?:_?[01])* # bin
+ |
+ o[0-7](?:_?[0-7])* # oct
+)
+|
+[+-]?(?:0|[1-9](?:_?[0-9])*) # dec, integer part
+(?P<floatpart>
+ (?:\.[0-9](?:_?[0-9])*)? # optional fractional part
+ (?:[eE][+-]?[0-9](?:_?[0-9])*)? # optional exponent part
+)
+""",
+ flags=re.VERBOSE,
+)
+RE_LOCALTIME = re.compile(_TIME_RE_STR)
+RE_DATETIME = re.compile(
+ rf"""
+([0-9]{{4}})-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01]) # date, e.g. 1988-10-27
+(?:
+ [Tt ]
+ {_TIME_RE_STR}
+ (?:([Zz])|([+-])([01][0-9]|2[0-3]):([0-5][0-9]))? # optional time offset
+)?
+""",
+ flags=re.VERBOSE,
+)
+
+
+def match_to_datetime(match: re.Match) -> datetime | date:
+ """Convert a `RE_DATETIME` match to `datetime.datetime` or `datetime.date`.
+
+ Raises ValueError if the match does not correspond to a valid date
+ or datetime.
+ """
+ (
+ year_str,
+ month_str,
+ day_str,
+ hour_str,
+ minute_str,
+ sec_str,
+ micros_str,
+ zulu_time,
+ offset_sign_str,
+ offset_hour_str,
+ offset_minute_str,
+ ) = match.groups()
+ year, month, day = int(year_str), int(month_str), int(day_str)
+ if hour_str is None:
+ return date(year, month, day)
+ hour, minute, sec = int(hour_str), int(minute_str), int(sec_str)
+ micros = int(micros_str.ljust(6, "0")) if micros_str else 0
+ if offset_sign_str:
+ tz: tzinfo | None = cached_tz(
+ offset_hour_str, offset_minute_str, offset_sign_str
+ )
+ elif zulu_time:
+ tz = timezone.utc
+ else: # local date-time
+ tz = None
+ return datetime(year, month, day, hour, minute, sec, micros, tzinfo=tz)
+
+
+@lru_cache(maxsize=None)
+def cached_tz(hour_str: str, minute_str: str, sign_str: str) -> timezone:
+ sign = 1 if sign_str == "+" else -1
+ return timezone(
+ timedelta(
+ hours=sign * int(hour_str),
+ minutes=sign * int(minute_str),
+ )
+ )
+
+
+def match_to_localtime(match: re.Match) -> time:
+ hour_str, minute_str, sec_str, micros_str = match.groups()
+ micros = int(micros_str.ljust(6, "0")) if micros_str else 0
+ return time(int(hour_str), int(minute_str), int(sec_str), micros)
+
+
+def match_to_number(match: re.Match, parse_float: ParseFloat) -> Any:
+ if match.group("floatpart"):
+ return parse_float(match.group())
+ return int(match.group(), 0)
diff --git a/src/tomli/_types.py b/src/tomli/_types.py
new file mode 100644
index 0000000..d949412
--- /dev/null
+++ b/src/tomli/_types.py
@@ -0,0 +1,10 @@
+# SPDX-License-Identifier: MIT
+# SPDX-FileCopyrightText: 2021 Taneli Hukkinen
+# Licensed to PSF under a Contributor Agreement.
+
+from typing import Any, Callable, Tuple
+
+# Type annotations
+ParseFloat = Callable[[str], Any]
+Key = Tuple[str, ...]
+Pos = int
diff --git a/src/tomli/py.typed b/src/tomli/py.typed
new file mode 100644
index 0000000..7632ecf
--- /dev/null
+++ b/src/tomli/py.typed
@@ -0,0 +1 @@
+# Marker file for PEP 561
diff --git a/tests/__init__.py b/tests/__init__.py
new file mode 100644
index 0000000..4e37361
--- /dev/null
+++ b/tests/__init__.py
@@ -0,0 +1,9 @@
+# SPDX-License-Identifier: MIT
+# SPDX-FileCopyrightText: 2021 Taneli Hukkinen
+# Licensed to PSF under a Contributor Agreement.
+
+__all__ = ("tomllib",)
+
+# By changing this one line, we can run the tests against
+# a different module name.
+import tomli as tomllib
diff --git a/tests/burntsushi.py b/tests/burntsushi.py
new file mode 100644
index 0000000..71228c6
--- /dev/null
+++ b/tests/burntsushi.py
@@ -0,0 +1,120 @@
+# SPDX-License-Identifier: MIT
+# SPDX-FileCopyrightText: 2021 Taneli Hukkinen
+# Licensed to PSF under a Contributor Agreement.
+
+"""Utilities for tests that are in the "burntsushi" format."""
+
+import datetime
+from typing import Any
+
+# Aliases for converting TOML compliance format [1] to BurntSushi format [2]
+# [1] https://github.com/toml-lang/compliance/blob/db7c3211fda30ff9ddb10292f4aeda7e2e10abc4/docs/json-encoding.md # noqa: E501
+# [2] https://github.com/BurntSushi/toml-test/blob/4634fdf3a6ecd6aaea5f4cdcd98b2733c2694993/README.md # noqa: E501
+_aliases = {
+ "boolean": "bool",
+ "offset datetime": "datetime",
+ "local datetime": "datetime-local",
+ "local date": "date-local",
+ "local time": "time-local",
+}
+
+
+def convert(obj): # noqa: C901
+ if isinstance(obj, str):
+ return {"type": "string", "value": obj}
+ elif isinstance(obj, bool):
+ return {"type": "bool", "value": str(obj).lower()}
+ elif isinstance(obj, int):
+ return {"type": "integer", "value": str(obj)}
+ elif isinstance(obj, float):
+ return {"type": "float", "value": _normalize_float_str(str(obj))}
+ elif isinstance(obj, datetime.datetime):
+ val = _normalize_datetime_str(obj.isoformat())
+ if obj.tzinfo:
+ return {"type": "datetime", "value": val}
+ return {"type": "datetime-local", "value": val}
+ elif isinstance(obj, datetime.time):
+ return {
+ "type": "time-local",
+ "value": _normalize_localtime_str(str(obj)),
+ }
+ elif isinstance(obj, datetime.date):
+ return {
+ "type": "date-local",
+ "value": str(obj),
+ }
+ elif isinstance(obj, list):
+ return [convert(i) for i in obj]
+ elif isinstance(obj, dict):
+ return {k: convert(v) for k, v in obj.items()}
+ raise Exception("unsupported type")
+
+
+def normalize(obj: Any) -> Any:
+ """Normalize test objects.
+
+ This normalizes primitive values (e.g. floats), and also converts from
+ TOML compliance format [1] to BurntSushi format [2].
+
+ [1] https://github.com/toml-lang/compliance/blob/db7c3211fda30ff9ddb10292f4aeda7e2e10abc4/docs/json-encoding.md # noqa: E501
+ [2] https://github.com/BurntSushi/toml-test/blob/4634fdf3a6ecd6aaea5f4cdcd98b2733c2694993/README.md # noqa: E501
+ """
+ if isinstance(obj, list):
+ return [normalize(item) for item in obj]
+ if isinstance(obj, dict):
+ if "type" in obj and "value" in obj:
+ type_ = obj["type"]
+ norm_type = _aliases.get(type_, type_)
+ value = obj["value"]
+ if norm_type == "float":
+ norm_value = _normalize_float_str(value)
+ elif norm_type in {"datetime", "datetime-local"}:
+ norm_value = _normalize_datetime_str(value)
+ elif norm_type == "time-local":
+ norm_value = _normalize_localtime_str(value)
+ else:
+ norm_value = value
+
+ if norm_type == "array":
+ return [normalize(item) for item in value]
+ return {"type": norm_type, "value": norm_value}
+ return {k: normalize(v) for k, v in obj.items()}
+ raise AssertionError("Burntsushi fixtures should be dicts/lists only")
+
+
+def _normalize_datetime_str(dt_str: str) -> str:
+ if dt_str[-1].lower() == "z":
+ dt_str = dt_str[:-1] + "+00:00"
+
+ date = dt_str[:10]
+ rest = dt_str[11:]
+
+ if "+" in rest:
+ sign = "+"
+ elif "-" in rest:
+ sign = "-"
+ else:
+ sign = ""
+
+ if sign:
+ time, _, offset = rest.partition(sign)
+ else:
+ time = rest
+ offset = ""
+
+ time = time.rstrip("0") if "." in time else time
+ return date + "T" + time + sign + offset
+
+
+def _normalize_localtime_str(lt_str: str) -> str:
+ return lt_str.rstrip("0") if "." in lt_str else lt_str
+
+
+def _normalize_float_str(float_str: str) -> str:
+ as_float = float(float_str)
+
+ # Normalize "-0.0" and "+0.0"
+ if as_float == 0:
+ return "0"
+
+ return str(as_float)
diff --git a/tests/data/invalid/array-missing-comma.toml b/tests/data/invalid/array-missing-comma.toml
new file mode 100644
index 0000000..9431d90
--- /dev/null
+++ b/tests/data/invalid/array-missing-comma.toml
@@ -0,0 +1 @@
+arrr = [true false]
diff --git a/tests/data/invalid/array-of-tables/overwrite-array-in-parent.toml b/tests/data/invalid/array-of-tables/overwrite-array-in-parent.toml
new file mode 100644
index 0000000..f867c28
--- /dev/null
+++ b/tests/data/invalid/array-of-tables/overwrite-array-in-parent.toml
@@ -0,0 +1,4 @@
+[[parent-table.arr]]
+[parent-table]
+not-arr = 1
+arr = 2
diff --git a/tests/data/invalid/array-of-tables/overwrite-bool-with-aot.toml b/tests/data/invalid/array-of-tables/overwrite-bool-with-aot.toml
new file mode 100644
index 0000000..b1892d6
--- /dev/null
+++ b/tests/data/invalid/array-of-tables/overwrite-bool-with-aot.toml
@@ -0,0 +1,2 @@
+a=true
+[[a]] \ No newline at end of file
diff --git a/tests/data/invalid/array/file-end-after-val.toml b/tests/data/invalid/array/file-end-after-val.toml
new file mode 100644
index 0000000..00196bb
--- /dev/null
+++ b/tests/data/invalid/array/file-end-after-val.toml
@@ -0,0 +1 @@
+a=[1 \ No newline at end of file
diff --git a/tests/data/invalid/array/unclosed-after-item.toml b/tests/data/invalid/array/unclosed-after-item.toml
new file mode 100644
index 0000000..9edec37
--- /dev/null
+++ b/tests/data/invalid/array/unclosed-after-item.toml
@@ -0,0 +1 @@
+v=[1, \ No newline at end of file
diff --git a/tests/data/invalid/array/unclosed-empty.toml b/tests/data/invalid/array/unclosed-empty.toml
new file mode 100644
index 0000000..1fd099d
--- /dev/null
+++ b/tests/data/invalid/array/unclosed-empty.toml
@@ -0,0 +1 @@
+v=[ \ No newline at end of file
diff --git a/tests/data/invalid/basic-str-ends-in-escape.toml b/tests/data/invalid/basic-str-ends-in-escape.toml
new file mode 100644
index 0000000..713ea54
--- /dev/null
+++ b/tests/data/invalid/basic-str-ends-in-escape.toml
@@ -0,0 +1 @@
+"backslash is the last char\ \ No newline at end of file
diff --git a/tests/data/invalid/boolean/invalid-false-casing.toml b/tests/data/invalid/boolean/invalid-false-casing.toml
new file mode 100644
index 0000000..336d2d8
--- /dev/null
+++ b/tests/data/invalid/boolean/invalid-false-casing.toml
@@ -0,0 +1 @@
+val=falsE \ No newline at end of file
diff --git a/tests/data/invalid/boolean/invalid-true-casing.toml b/tests/data/invalid/boolean/invalid-true-casing.toml
new file mode 100644
index 0000000..0370d6c
--- /dev/null
+++ b/tests/data/invalid/boolean/invalid-true-casing.toml
@@ -0,0 +1 @@
+val=trUe \ No newline at end of file
diff --git a/tests/data/invalid/burntsushi/COPYING b/tests/data/invalid/burntsushi/COPYING
new file mode 100644
index 0000000..93b2202
--- /dev/null
+++ b/tests/data/invalid/burntsushi/COPYING
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2018 TOML authors
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/tests/data/invalid/burntsushi/invalid/array/missing-separator.toml b/tests/data/invalid/burntsushi/invalid/array/missing-separator.toml
new file mode 100644
index 0000000..ab3791a
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/array/missing-separator.toml
@@ -0,0 +1 @@
+wrong = [ 1 2 3 ]
diff --git a/tests/data/invalid/burntsushi/invalid/array/no-close-2.toml b/tests/data/invalid/burntsushi/invalid/array/no-close-2.toml
new file mode 100644
index 0000000..2f46123
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/array/no-close-2.toml
@@ -0,0 +1 @@
+x = [42 #
diff --git a/tests/data/invalid/burntsushi/invalid/array/no-close-table-2.toml b/tests/data/invalid/burntsushi/invalid/array/no-close-table-2.toml
new file mode 100644
index 0000000..827c128
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/array/no-close-table-2.toml
@@ -0,0 +1 @@
+x = [{ key = 42 #
diff --git a/tests/data/invalid/burntsushi/invalid/array/no-close-table.toml b/tests/data/invalid/burntsushi/invalid/array/no-close-table.toml
new file mode 100644
index 0000000..7b077be
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/array/no-close-table.toml
@@ -0,0 +1 @@
+x = [{ key = 42
diff --git a/tests/data/invalid/burntsushi/invalid/array/no-close.toml b/tests/data/invalid/burntsushi/invalid/array/no-close.toml
new file mode 100644
index 0000000..032ebcc
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/array/no-close.toml
@@ -0,0 +1 @@
+long_array = [ 1, 2, 3
diff --git a/tests/data/invalid/burntsushi/invalid/array/tables-1.toml b/tests/data/invalid/burntsushi/invalid/array/tables-1.toml
new file mode 100644
index 0000000..01d4d13
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/array/tables-1.toml
@@ -0,0 +1,4 @@
+# INVALID TOML DOC
+fruit = []
+
+[[fruit]] # Not allowed
diff --git a/tests/data/invalid/burntsushi/invalid/array/tables-2.toml b/tests/data/invalid/burntsushi/invalid/array/tables-2.toml
new file mode 100644
index 0000000..a77b0e4
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/array/tables-2.toml
@@ -0,0 +1,10 @@
+# INVALID TOML DOC
+[[fruit]]
+ name = "apple"
+
+ [[fruit.variety]]
+ name = "red delicious"
+
+ # This table conflicts with the previous table
+ [fruit.variety]
+ name = "granny smith"
diff --git a/tests/data/invalid/burntsushi/invalid/array/text-after-array-entries.toml b/tests/data/invalid/burntsushi/invalid/array/text-after-array-entries.toml
new file mode 100644
index 0000000..1a72890
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/array/text-after-array-entries.toml
@@ -0,0 +1,4 @@
+array = [
+ "Is there life after an array separator?", No
+ "Entry"
+]
diff --git a/tests/data/invalid/burntsushi/invalid/array/text-before-array-separator.toml b/tests/data/invalid/burntsushi/invalid/array/text-before-array-separator.toml
new file mode 100644
index 0000000..9b06a39
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/array/text-before-array-separator.toml
@@ -0,0 +1,4 @@
+array = [
+ "Is there life before an array separator?" No,
+ "Entry"
+]
diff --git a/tests/data/invalid/burntsushi/invalid/array/text-in-array.toml b/tests/data/invalid/burntsushi/invalid/array/text-in-array.toml
new file mode 100644
index 0000000..a6a6c42
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/array/text-in-array.toml
@@ -0,0 +1,5 @@
+array = [
+ "Entry 1",
+ I don't belong,
+ "Entry 2",
+]
diff --git a/tests/data/invalid/burntsushi/invalid/bool/mixed-case.toml b/tests/data/invalid/burntsushi/invalid/bool/mixed-case.toml
new file mode 100644
index 0000000..41d995a
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/bool/mixed-case.toml
@@ -0,0 +1 @@
+valid = False
diff --git a/tests/data/invalid/burntsushi/invalid/bool/wrong-case-false.toml b/tests/data/invalid/burntsushi/invalid/bool/wrong-case-false.toml
new file mode 100644
index 0000000..3982220
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/bool/wrong-case-false.toml
@@ -0,0 +1 @@
+b = FALSE
diff --git a/tests/data/invalid/burntsushi/invalid/bool/wrong-case-true.toml b/tests/data/invalid/burntsushi/invalid/bool/wrong-case-true.toml
new file mode 100644
index 0000000..85e34c5
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/bool/wrong-case-true.toml
@@ -0,0 +1 @@
+a = TRUE
diff --git a/tests/data/invalid/burntsushi/invalid/control/bare-null.toml b/tests/data/invalid/burntsushi/invalid/control/bare-null.toml
new file mode 100644
index 0000000..cf15002
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/control/bare-null.toml
Binary files differ
diff --git a/tests/data/invalid/burntsushi/invalid/control/comment-cr.toml b/tests/data/invalid/burntsushi/invalid/control/comment-cr.toml
new file mode 100644
index 0000000..3ce1cb4
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/control/comment-cr.toml
@@ -0,0 +1 @@
+comment-cr = "Carriage return in comment" # a=1
diff --git a/tests/data/invalid/burntsushi/invalid/control/comment-del.toml b/tests/data/invalid/burntsushi/invalid/control/comment-del.toml
new file mode 100644
index 0000000..fb90400
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/control/comment-del.toml
@@ -0,0 +1 @@
+comment-del = "0x7f" # 
diff --git a/tests/data/invalid/burntsushi/invalid/control/comment-lf.toml b/tests/data/invalid/burntsushi/invalid/control/comment-lf.toml
new file mode 100644
index 0000000..f6e963e
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/control/comment-lf.toml
@@ -0,0 +1 @@
+comment-lf = "ctrl-P" # 
diff --git a/tests/data/invalid/burntsushi/invalid/control/comment-null.toml b/tests/data/invalid/burntsushi/invalid/control/comment-null.toml
new file mode 100644
index 0000000..2c90372
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/control/comment-null.toml
Binary files differ
diff --git a/tests/data/invalid/burntsushi/invalid/control/comment-us.toml b/tests/data/invalid/burntsushi/invalid/control/comment-us.toml
new file mode 100644
index 0000000..c685b79
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/control/comment-us.toml
@@ -0,0 +1 @@
+comment-us = "ctrl-_" # 
diff --git a/tests/data/invalid/burntsushi/invalid/control/control.multi b/tests/data/invalid/burntsushi/invalid/control/control.multi
new file mode 100644
index 0000000..705b58a
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/control/control.multi
Binary files differ
diff --git a/tests/data/invalid/burntsushi/invalid/control/multi-del.toml b/tests/data/invalid/burntsushi/invalid/control/multi-del.toml
new file mode 100644
index 0000000..6629ae3
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/control/multi-del.toml
@@ -0,0 +1 @@
+multi-del = """null"""
diff --git a/tests/data/invalid/burntsushi/invalid/control/multi-lf.toml b/tests/data/invalid/burntsushi/invalid/control/multi-lf.toml
new file mode 100644
index 0000000..f207d33
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/control/multi-lf.toml
@@ -0,0 +1 @@
+multi-lf = """null"""
diff --git a/tests/data/invalid/burntsushi/invalid/control/multi-null.toml b/tests/data/invalid/burntsushi/invalid/control/multi-null.toml
new file mode 100644
index 0000000..ac6cb46
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/control/multi-null.toml
Binary files differ
diff --git a/tests/data/invalid/burntsushi/invalid/control/multi-us.toml b/tests/data/invalid/burntsushi/invalid/control/multi-us.toml
new file mode 100644
index 0000000..b923ca9
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/control/multi-us.toml
@@ -0,0 +1 @@
+multi-us = """null"""
diff --git a/tests/data/invalid/burntsushi/invalid/control/rawmulti-del.toml b/tests/data/invalid/burntsushi/invalid/control/rawmulti-del.toml
new file mode 100644
index 0000000..17cde07
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/control/rawmulti-del.toml
@@ -0,0 +1 @@
+rawmulti-del = '''null'''
diff --git a/tests/data/invalid/burntsushi/invalid/control/rawmulti-lf.toml b/tests/data/invalid/burntsushi/invalid/control/rawmulti-lf.toml
new file mode 100644
index 0000000..360d489
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/control/rawmulti-lf.toml
@@ -0,0 +1 @@
+rawmulti-lf = '''null'''
diff --git a/tests/data/invalid/burntsushi/invalid/control/rawmulti-null.toml b/tests/data/invalid/burntsushi/invalid/control/rawmulti-null.toml
new file mode 100644
index 0000000..1b5bd09
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/control/rawmulti-null.toml
Binary files differ
diff --git a/tests/data/invalid/burntsushi/invalid/control/rawmulti-us.toml b/tests/data/invalid/burntsushi/invalid/control/rawmulti-us.toml
new file mode 100644
index 0000000..0251420
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/control/rawmulti-us.toml
@@ -0,0 +1 @@
+rawmulti-us = '''null'''
diff --git a/tests/data/invalid/burntsushi/invalid/control/rawstring-del.toml b/tests/data/invalid/burntsushi/invalid/control/rawstring-del.toml
new file mode 100644
index 0000000..8d83ba8
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/control/rawstring-del.toml
@@ -0,0 +1 @@
+rawstring-del = 'null'
diff --git a/tests/data/invalid/burntsushi/invalid/control/rawstring-lf.toml b/tests/data/invalid/burntsushi/invalid/control/rawstring-lf.toml
new file mode 100644
index 0000000..237470a
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/control/rawstring-lf.toml
@@ -0,0 +1 @@
+rawstring-lf = 'null'
diff --git a/tests/data/invalid/burntsushi/invalid/control/rawstring-null.toml b/tests/data/invalid/burntsushi/invalid/control/rawstring-null.toml
new file mode 100644
index 0000000..2d8d0b4
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/control/rawstring-null.toml
Binary files differ
diff --git a/tests/data/invalid/burntsushi/invalid/control/rawstring-us.toml b/tests/data/invalid/burntsushi/invalid/control/rawstring-us.toml
new file mode 100644
index 0000000..76cb08c
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/control/rawstring-us.toml
@@ -0,0 +1 @@
+rawstring-us = 'null'
diff --git a/tests/data/invalid/burntsushi/invalid/control/string-bs.toml b/tests/data/invalid/burntsushi/invalid/control/string-bs.toml
new file mode 100644
index 0000000..0061c48
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/control/string-bs.toml
@@ -0,0 +1 @@
+string-bs = "backspace"
diff --git a/tests/data/invalid/burntsushi/invalid/control/string-del.toml b/tests/data/invalid/burntsushi/invalid/control/string-del.toml
new file mode 100644
index 0000000..bc0ec7f
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/control/string-del.toml
@@ -0,0 +1 @@
+string-del = "null"
diff --git a/tests/data/invalid/burntsushi/invalid/control/string-lf.toml b/tests/data/invalid/burntsushi/invalid/control/string-lf.toml
new file mode 100644
index 0000000..0cf9218
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/control/string-lf.toml
@@ -0,0 +1 @@
+string-lf = "null"
diff --git a/tests/data/invalid/burntsushi/invalid/control/string-null.toml b/tests/data/invalid/burntsushi/invalid/control/string-null.toml
new file mode 100644
index 0000000..821c72c
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/control/string-null.toml
Binary files differ
diff --git a/tests/data/invalid/burntsushi/invalid/control/string-us.toml b/tests/data/invalid/burntsushi/invalid/control/string-us.toml
new file mode 100644
index 0000000..af31f57
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/control/string-us.toml
@@ -0,0 +1 @@
+string-us = "null"
diff --git a/tests/data/invalid/burntsushi/invalid/datetime/hour-over.toml b/tests/data/invalid/burntsushi/invalid/datetime/hour-over.toml
new file mode 100644
index 0000000..d4b89b6
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/datetime/hour-over.toml
@@ -0,0 +1,2 @@
+# time-hour = 2DIGIT ; 00-23
+d = 2006-01-01T24:00:00-00:00
diff --git a/tests/data/invalid/burntsushi/invalid/datetime/mday-over.toml b/tests/data/invalid/burntsushi/invalid/datetime/mday-over.toml
new file mode 100644
index 0000000..600a409
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/datetime/mday-over.toml
@@ -0,0 +1,3 @@
+# date-mday = 2DIGIT ; 01-28, 01-29, 01-30, 01-31 based on
+# ; month/year
+d = 2006-01-32T00:00:00-00:00
diff --git a/tests/data/invalid/burntsushi/invalid/datetime/mday-under.toml b/tests/data/invalid/burntsushi/invalid/datetime/mday-under.toml
new file mode 100644
index 0000000..689fc98
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/datetime/mday-under.toml
@@ -0,0 +1,3 @@
+# date-mday = 2DIGIT ; 01-28, 01-29, 01-30, 01-31 based on
+# ; month/year
+d = 2006-01-00T00:00:00-00:00
diff --git a/tests/data/invalid/burntsushi/invalid/datetime/minute-over.toml b/tests/data/invalid/burntsushi/invalid/datetime/minute-over.toml
new file mode 100644
index 0000000..1532d79
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/datetime/minute-over.toml
@@ -0,0 +1,2 @@
+# time-minute = 2DIGIT ; 00-59
+d = 2006-01-01T00:60:00-00:00
diff --git a/tests/data/invalid/burntsushi/invalid/datetime/month-over.toml b/tests/data/invalid/burntsushi/invalid/datetime/month-over.toml
new file mode 100644
index 0000000..c7d40c9
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/datetime/month-over.toml
@@ -0,0 +1,2 @@
+# date-month = 2DIGIT ; 01-12
+d = 2006-13-01T00:00:00-00:00
diff --git a/tests/data/invalid/burntsushi/invalid/datetime/month-under.toml b/tests/data/invalid/burntsushi/invalid/datetime/month-under.toml
new file mode 100644
index 0000000..503f60a
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/datetime/month-under.toml
@@ -0,0 +1,2 @@
+# date-month = 2DIGIT ; 01-12
+d = 2007-00-01T00:00:00-00:00
diff --git a/tests/data/invalid/burntsushi/invalid/datetime/no-leads-with-milli.toml b/tests/data/invalid/burntsushi/invalid/datetime/no-leads-with-milli.toml
new file mode 100644
index 0000000..6e3d2e3
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/datetime/no-leads-with-milli.toml
@@ -0,0 +1,2 @@
+# Day "5" instead of "05"; the leading zero is required.
+with-milli = 1987-07-5T17:45:00.12Z
diff --git a/tests/data/invalid/burntsushi/invalid/datetime/no-leads.toml b/tests/data/invalid/burntsushi/invalid/datetime/no-leads.toml
new file mode 100644
index 0000000..6700d1c
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/datetime/no-leads.toml
@@ -0,0 +1,2 @@
+# Month "7" instead of "07"; the leading zero is required.
+no-leads = 1987-7-05T17:45:00Z
diff --git a/tests/data/invalid/burntsushi/invalid/datetime/no-secs.toml b/tests/data/invalid/burntsushi/invalid/datetime/no-secs.toml
new file mode 100644
index 0000000..bbd196a
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/datetime/no-secs.toml
@@ -0,0 +1,2 @@
+# No seconds in time.
+no-secs = 1987-07-05T17:45Z
diff --git a/tests/data/invalid/burntsushi/invalid/datetime/no-t.toml b/tests/data/invalid/burntsushi/invalid/datetime/no-t.toml
new file mode 100644
index 0000000..8d87260
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/datetime/no-t.toml
@@ -0,0 +1,2 @@
+# No "t" or "T" between the date and time.
+no-t = 1987-07-0517:45:00Z
diff --git a/tests/data/invalid/burntsushi/invalid/datetime/second-over.toml b/tests/data/invalid/burntsushi/invalid/datetime/second-over.toml
new file mode 100644
index 0000000..4921704
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/datetime/second-over.toml
@@ -0,0 +1,3 @@
+# time-second = 2DIGIT ; 00-58, 00-59, 00-60 based on leap second
+# ; rules
+d = 2006-01-01T00:00:61-00:00
diff --git a/tests/data/invalid/burntsushi/invalid/datetime/time-no-leads-2.toml b/tests/data/invalid/burntsushi/invalid/datetime/time-no-leads-2.toml
new file mode 100644
index 0000000..d7b8459
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/datetime/time-no-leads-2.toml
@@ -0,0 +1,2 @@
+# Leading 0 is always required.
+d = 01:32:0
diff --git a/tests/data/invalid/burntsushi/invalid/datetime/time-no-leads.toml b/tests/data/invalid/burntsushi/invalid/datetime/time-no-leads.toml
new file mode 100644
index 0000000..8ad722a
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/datetime/time-no-leads.toml
@@ -0,0 +1,2 @@
+# Leading 0 is always required.
+d = 1:32:00
diff --git a/tests/data/invalid/burntsushi/invalid/datetime/trailing-t.toml b/tests/data/invalid/burntsushi/invalid/datetime/trailing-t.toml
new file mode 100644
index 0000000..38ee1db
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/datetime/trailing-t.toml
@@ -0,0 +1,2 @@
+# Date cannot end with trailing T
+d = 2006-01-30T
diff --git a/tests/data/invalid/burntsushi/invalid/encoding/bad-utf8-at-end.toml b/tests/data/invalid/burntsushi/invalid/encoding/bad-utf8-at-end.toml
new file mode 100644
index 0000000..df5f0b0
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/encoding/bad-utf8-at-end.toml
@@ -0,0 +1,5 @@
+# There is a 0xda at after the quotes, and no EOL at the end of the file.
+#
+# This is a bit of an edge case: This indicates there should be two bytes
+# (0b1101_1010) but there is no byte to follow because it's the end of the file.
+x = """""" \ No newline at end of file
diff --git a/tests/data/invalid/burntsushi/invalid/encoding/bad-utf8-in-comment.toml b/tests/data/invalid/burntsushi/invalid/encoding/bad-utf8-in-comment.toml
new file mode 100644
index 0000000..816fa46
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/encoding/bad-utf8-in-comment.toml
@@ -0,0 +1 @@
+#
diff --git a/tests/data/invalid/burntsushi/invalid/encoding/bad-utf8-in-string.toml b/tests/data/invalid/burntsushi/invalid/encoding/bad-utf8-in-string.toml
new file mode 100644
index 0000000..6d376fb
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/encoding/bad-utf8-in-string.toml
@@ -0,0 +1,2 @@
+# The following line contains an invalid UTF-8 sequence.
+bad = ""
diff --git a/tests/data/invalid/burntsushi/invalid/encoding/bom-not-at-start-1.toml b/tests/data/invalid/burntsushi/invalid/encoding/bom-not-at-start-1.toml
new file mode 100644
index 0000000..effe1f2
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/encoding/bom-not-at-start-1.toml
@@ -0,0 +1 @@
+bom-not-at-start
diff --git a/tests/data/invalid/burntsushi/invalid/encoding/bom-not-at-start-2.toml b/tests/data/invalid/burntsushi/invalid/encoding/bom-not-at-start-2.toml
new file mode 100644
index 0000000..71e52b4
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/encoding/bom-not-at-start-2.toml
@@ -0,0 +1 @@
+bom-not-at-start=
diff --git a/tests/data/invalid/burntsushi/invalid/encoding/utf16-bom.toml b/tests/data/invalid/burntsushi/invalid/encoding/utf16-bom.toml
new file mode 100644
index 0000000..95b5f96
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/encoding/utf16-bom.toml
Binary files differ
diff --git a/tests/data/invalid/burntsushi/invalid/encoding/utf16.toml b/tests/data/invalid/burntsushi/invalid/encoding/utf16.toml
new file mode 100644
index 0000000..de3cbb2
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/encoding/utf16.toml
Binary files differ
diff --git a/tests/data/invalid/burntsushi/invalid/float/double-point-1.toml b/tests/data/invalid/burntsushi/invalid/float/double-point-1.toml
new file mode 100644
index 0000000..2105fa9
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/float/double-point-1.toml
@@ -0,0 +1 @@
+double-point-1 = 0..1
diff --git a/tests/data/invalid/burntsushi/invalid/float/double-point-2.toml b/tests/data/invalid/burntsushi/invalid/float/double-point-2.toml
new file mode 100644
index 0000000..1ef3d0b
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/float/double-point-2.toml
@@ -0,0 +1 @@
+double-point-2 = 0.1.2
diff --git a/tests/data/invalid/burntsushi/invalid/float/exp-double-e-1.toml b/tests/data/invalid/burntsushi/invalid/float/exp-double-e-1.toml
new file mode 100644
index 0000000..ee568ce
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/float/exp-double-e-1.toml
@@ -0,0 +1 @@
+exp-double-e-1 = 1ee2
diff --git a/tests/data/invalid/burntsushi/invalid/float/exp-double-e-2.toml b/tests/data/invalid/burntsushi/invalid/float/exp-double-e-2.toml
new file mode 100644
index 0000000..8fb0158
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/float/exp-double-e-2.toml
@@ -0,0 +1 @@
+exp-double-e-2 = 1e2e3
diff --git a/tests/data/invalid/burntsushi/invalid/float/exp-double-us.toml b/tests/data/invalid/burntsushi/invalid/float/exp-double-us.toml
new file mode 100644
index 0000000..63f94e6
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/float/exp-double-us.toml
@@ -0,0 +1 @@
+exp-double-us = 1e__23
diff --git a/tests/data/invalid/burntsushi/invalid/float/exp-leading-us.toml b/tests/data/invalid/burntsushi/invalid/float/exp-leading-us.toml
new file mode 100644
index 0000000..1426f36
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/float/exp-leading-us.toml
@@ -0,0 +1 @@
+exp-leading-us = 1e_23
diff --git a/tests/data/invalid/burntsushi/invalid/float/exp-point-1.toml b/tests/data/invalid/burntsushi/invalid/float/exp-point-1.toml
new file mode 100644
index 0000000..569590b
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/float/exp-point-1.toml
@@ -0,0 +1 @@
+exp-point-1 = 1e2.3
diff --git a/tests/data/invalid/burntsushi/invalid/float/exp-point-2.toml b/tests/data/invalid/burntsushi/invalid/float/exp-point-2.toml
new file mode 100644
index 0000000..4a5e1d4
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/float/exp-point-2.toml
@@ -0,0 +1 @@
+exp-point-2 = 1.e2
diff --git a/tests/data/invalid/burntsushi/invalid/float/exp-trailing-us.toml b/tests/data/invalid/burntsushi/invalid/float/exp-trailing-us.toml
new file mode 100644
index 0000000..07c0641
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/float/exp-trailing-us.toml
@@ -0,0 +1 @@
+exp-trailing-us = 1e_23_
diff --git a/tests/data/invalid/burntsushi/invalid/float/float.multi b/tests/data/invalid/burntsushi/invalid/float/float.multi
new file mode 100644
index 0000000..0708195
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/float/float.multi
@@ -0,0 +1,40 @@
+leading-zero = 03.14
+leading-zero-neg = -03.14
+leading-zero-plus = +03.14
+
+leading-point = .12345
+leading-point-neg = -.12345
+leading-point-plus = +.12345
+
+trailing-point = 1.
+trailing-point-min = -1.
+trailing-point-plus = +1.
+
+trailing-us = 1.2_
+leading-us = _1.2
+us-before-point = 1_.2
+us-after-point = 1._2
+
+double-point-1 = 0..1
+double-point-2 = 0.1.2
+
+exp-point-1 = 1e2.3
+exp-point-2 = 1.e2
+
+exp-double-e-1 = 1ee2
+exp-double-e-2 = 1e2e3
+
+exp-leading-us = 1e_23
+exp-trailing-us = 1e_23_
+exp-double-us = 1e__23
+
+inf-incomplete-1 = in
+inf-incomplete-2 = +in
+inf-incomplete-3 = -in
+
+nan-incomplete-1 = na
+nan-incomplete-2 = +na
+nan-incomplete-3 = -na
+
+nan_underscore = na_n
+inf_underscore = in_f
diff --git a/tests/data/invalid/burntsushi/invalid/float/inf-incomplete-1.toml b/tests/data/invalid/burntsushi/invalid/float/inf-incomplete-1.toml
new file mode 100644
index 0000000..2c9ef59
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/float/inf-incomplete-1.toml
@@ -0,0 +1 @@
+inf-incomplete-1 = in
diff --git a/tests/data/invalid/burntsushi/invalid/float/inf-incomplete-2.toml b/tests/data/invalid/burntsushi/invalid/float/inf-incomplete-2.toml
new file mode 100644
index 0000000..afda712
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/float/inf-incomplete-2.toml
@@ -0,0 +1 @@
+inf-incomplete-2 = +in
diff --git a/tests/data/invalid/burntsushi/invalid/float/inf-incomplete-3.toml b/tests/data/invalid/burntsushi/invalid/float/inf-incomplete-3.toml
new file mode 100644
index 0000000..bd82738
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/float/inf-incomplete-3.toml
@@ -0,0 +1 @@
+inf-incomplete-3 = -in
diff --git a/tests/data/invalid/burntsushi/invalid/float/inf_underscore.toml b/tests/data/invalid/burntsushi/invalid/float/inf_underscore.toml
new file mode 100644
index 0000000..8e6ab17
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/float/inf_underscore.toml
@@ -0,0 +1 @@
+inf_underscore = in_f
diff --git a/tests/data/invalid/burntsushi/invalid/float/leading-point-neg.toml b/tests/data/invalid/burntsushi/invalid/float/leading-point-neg.toml
new file mode 100644
index 0000000..74c526f
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/float/leading-point-neg.toml
@@ -0,0 +1 @@
+leading-point-neg = -.12345
diff --git a/tests/data/invalid/burntsushi/invalid/float/leading-point-plus.toml b/tests/data/invalid/burntsushi/invalid/float/leading-point-plus.toml
new file mode 100644
index 0000000..85e23a2
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/float/leading-point-plus.toml
@@ -0,0 +1 @@
+leading-point-plus = +.12345
diff --git a/tests/data/invalid/burntsushi/invalid/float/leading-point.toml b/tests/data/invalid/burntsushi/invalid/float/leading-point.toml
new file mode 100644
index 0000000..a3c29b9
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/float/leading-point.toml
@@ -0,0 +1 @@
+leading-point = .12345
diff --git a/tests/data/invalid/burntsushi/invalid/float/leading-us.toml b/tests/data/invalid/burntsushi/invalid/float/leading-us.toml
new file mode 100644
index 0000000..fa94fd0
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/float/leading-us.toml
@@ -0,0 +1 @@
+leading-us = _1.2
diff --git a/tests/data/invalid/burntsushi/invalid/float/leading-zero-neg.toml b/tests/data/invalid/burntsushi/invalid/float/leading-zero-neg.toml
new file mode 100644
index 0000000..94a4e70
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/float/leading-zero-neg.toml
@@ -0,0 +1 @@
+leading-zero-neg = -03.14
diff --git a/tests/data/invalid/burntsushi/invalid/float/leading-zero-plus.toml b/tests/data/invalid/burntsushi/invalid/float/leading-zero-plus.toml
new file mode 100644
index 0000000..12bfd60
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/float/leading-zero-plus.toml
@@ -0,0 +1 @@
+leading-zero-plus = +03.14
diff --git a/tests/data/invalid/burntsushi/invalid/float/leading-zero.toml b/tests/data/invalid/burntsushi/invalid/float/leading-zero.toml
new file mode 100644
index 0000000..551fb25
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/float/leading-zero.toml
@@ -0,0 +1 @@
+leading-zero = 03.14
diff --git a/tests/data/invalid/burntsushi/invalid/float/nan-incomplete-1.toml b/tests/data/invalid/burntsushi/invalid/float/nan-incomplete-1.toml
new file mode 100644
index 0000000..df2e261
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/float/nan-incomplete-1.toml
@@ -0,0 +1 @@
+nan-incomplete-1 = na
diff --git a/tests/data/invalid/burntsushi/invalid/float/nan-incomplete-2.toml b/tests/data/invalid/burntsushi/invalid/float/nan-incomplete-2.toml
new file mode 100644
index 0000000..6d2e8fb
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/float/nan-incomplete-2.toml
@@ -0,0 +1 @@
+nan-incomplete-2 = +na
diff --git a/tests/data/invalid/burntsushi/invalid/float/nan-incomplete-3.toml b/tests/data/invalid/burntsushi/invalid/float/nan-incomplete-3.toml
new file mode 100644
index 0000000..9d365ac
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/float/nan-incomplete-3.toml
@@ -0,0 +1 @@
+nan-incomplete-3 = -na
diff --git a/tests/data/invalid/burntsushi/invalid/float/nan_underscore.toml b/tests/data/invalid/burntsushi/invalid/float/nan_underscore.toml
new file mode 100644
index 0000000..44c8bf1
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/float/nan_underscore.toml
@@ -0,0 +1 @@
+nan_underscore = na_n
diff --git a/tests/data/invalid/burntsushi/invalid/float/trailing-point-min.toml b/tests/data/invalid/burntsushi/invalid/float/trailing-point-min.toml
new file mode 100644
index 0000000..48741e3
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/float/trailing-point-min.toml
@@ -0,0 +1 @@
+trailing-point-min = -1.
diff --git a/tests/data/invalid/burntsushi/invalid/float/trailing-point-plus.toml b/tests/data/invalid/burntsushi/invalid/float/trailing-point-plus.toml
new file mode 100644
index 0000000..9926039
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/float/trailing-point-plus.toml
@@ -0,0 +1 @@
+trailing-point-plus = +1.
diff --git a/tests/data/invalid/burntsushi/invalid/float/trailing-point.toml b/tests/data/invalid/burntsushi/invalid/float/trailing-point.toml
new file mode 100644
index 0000000..76c95d9
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/float/trailing-point.toml
@@ -0,0 +1 @@
+trailing-point = 1.
diff --git a/tests/data/invalid/burntsushi/invalid/float/trailing-us-exp.toml b/tests/data/invalid/burntsushi/invalid/float/trailing-us-exp.toml
new file mode 100644
index 0000000..7bba971
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/float/trailing-us-exp.toml
@@ -0,0 +1,4 @@
+# trailing underscore in integer part is not allowed
+trailing-us-exp = 1_e2
+# trailing underscore in float part is not allowed
+trailing-us-exp2 = 1.2_e2
diff --git a/tests/data/invalid/burntsushi/invalid/float/trailing-us.toml b/tests/data/invalid/burntsushi/invalid/float/trailing-us.toml
new file mode 100644
index 0000000..ddfb7ba
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/float/trailing-us.toml
@@ -0,0 +1 @@
+trailing-us = 1.2_
diff --git a/tests/data/invalid/burntsushi/invalid/float/us-after-point.toml b/tests/data/invalid/burntsushi/invalid/float/us-after-point.toml
new file mode 100644
index 0000000..7f15f57
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/float/us-after-point.toml
@@ -0,0 +1 @@
+us-after-point = 1._2
diff --git a/tests/data/invalid/burntsushi/invalid/float/us-before-point.toml b/tests/data/invalid/burntsushi/invalid/float/us-before-point.toml
new file mode 100644
index 0000000..c8edcbf
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/float/us-before-point.toml
@@ -0,0 +1 @@
+us-before-point = 1_.2
diff --git a/tests/data/invalid/burntsushi/invalid/inline-table/double-comma.toml b/tests/data/invalid/burntsushi/invalid/inline-table/double-comma.toml
new file mode 100644
index 0000000..2d2913a
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/inline-table/double-comma.toml
@@ -0,0 +1 @@
+t = {x=3,,y=4}
diff --git a/tests/data/invalid/burntsushi/invalid/inline-table/duplicate-key.toml b/tests/data/invalid/burntsushi/invalid/inline-table/duplicate-key.toml
new file mode 100644
index 0000000..0789e14
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/inline-table/duplicate-key.toml
@@ -0,0 +1,2 @@
+# Duplicate keys within an inline table are invalid
+a={b=1, b=2}
diff --git a/tests/data/invalid/burntsushi/invalid/inline-table/empty.toml b/tests/data/invalid/burntsushi/invalid/inline-table/empty.toml
new file mode 100644
index 0000000..ebbb066
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/inline-table/empty.toml
@@ -0,0 +1 @@
+t = {,}
diff --git a/tests/data/invalid/burntsushi/invalid/inline-table/linebreak-1.toml b/tests/data/invalid/burntsushi/invalid/inline-table/linebreak-1.toml
new file mode 100644
index 0000000..0ae44b6
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/inline-table/linebreak-1.toml
@@ -0,0 +1,4 @@
+# No newlines are allowed between the curly braces unless they are valid within
+# a value.
+simple = { a = 1
+}
diff --git a/tests/data/invalid/burntsushi/invalid/inline-table/linebreak-2.toml b/tests/data/invalid/burntsushi/invalid/inline-table/linebreak-2.toml
new file mode 100644
index 0000000..5ea4eaf
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/inline-table/linebreak-2.toml
@@ -0,0 +1,2 @@
+t = {a=1,
+b=2}
diff --git a/tests/data/invalid/burntsushi/invalid/inline-table/linebreak-3.toml b/tests/data/invalid/burntsushi/invalid/inline-table/linebreak-3.toml
new file mode 100644
index 0000000..7f6e892
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/inline-table/linebreak-3.toml
@@ -0,0 +1,2 @@
+t = {a=1
+,b=2}
diff --git a/tests/data/invalid/burntsushi/invalid/inline-table/linebreak-4.toml b/tests/data/invalid/burntsushi/invalid/inline-table/linebreak-4.toml
new file mode 100644
index 0000000..3f34e15
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/inline-table/linebreak-4.toml
@@ -0,0 +1,4 @@
+json_like = {
+ first = "Tom",
+ last = "Preston-Werner"
+}
diff --git a/tests/data/invalid/burntsushi/invalid/inline-table/no-comma.toml b/tests/data/invalid/burntsushi/invalid/inline-table/no-comma.toml
new file mode 100644
index 0000000..0a4083d
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/inline-table/no-comma.toml
@@ -0,0 +1 @@
+t = {x = 3 y = 4}
diff --git a/tests/data/invalid/burntsushi/invalid/inline-table/overwrite.toml b/tests/data/invalid/burntsushi/invalid/inline-table/overwrite.toml
new file mode 100644
index 0000000..4da0a85
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/inline-table/overwrite.toml
@@ -0,0 +1,3 @@
+a.b=0
+# Since table "a" is already defined, it can't be replaced by an inline table.
+a={}
diff --git a/tests/data/invalid/burntsushi/invalid/inline-table/trailing-comma.toml b/tests/data/invalid/burntsushi/invalid/inline-table/trailing-comma.toml
new file mode 100644
index 0000000..6b67e02
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/inline-table/trailing-comma.toml
@@ -0,0 +1,3 @@
+# A terminating comma (also called trailing comma) is not permitted after the
+# last key/value pair in an inline table
+abc = { abc = 123, }
diff --git a/tests/data/invalid/burntsushi/invalid/integer/capital-bin.toml b/tests/data/invalid/burntsushi/invalid/integer/capital-bin.toml
new file mode 100644
index 0000000..bea4e5e
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/integer/capital-bin.toml
@@ -0,0 +1 @@
+capital-bin = 0B0
diff --git a/tests/data/invalid/burntsushi/invalid/integer/capital-hex.toml b/tests/data/invalid/burntsushi/invalid/integer/capital-hex.toml
new file mode 100644
index 0000000..bc064bb
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/integer/capital-hex.toml
@@ -0,0 +1 @@
+capital-hex = 0X1
diff --git a/tests/data/invalid/burntsushi/invalid/integer/capital-oct.toml b/tests/data/invalid/burntsushi/invalid/integer/capital-oct.toml
new file mode 100644
index 0000000..ea08a4d
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/integer/capital-oct.toml
@@ -0,0 +1 @@
+capital-oct = 0O0
diff --git a/tests/data/invalid/burntsushi/invalid/integer/double-sign-nex.toml b/tests/data/invalid/burntsushi/invalid/integer/double-sign-nex.toml
new file mode 100644
index 0000000..ff014cf
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/integer/double-sign-nex.toml
@@ -0,0 +1 @@
+double-sign-nex = --99
diff --git a/tests/data/invalid/burntsushi/invalid/integer/double-sign-plus.toml b/tests/data/invalid/burntsushi/invalid/integer/double-sign-plus.toml
new file mode 100644
index 0000000..845ebb5
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/integer/double-sign-plus.toml
@@ -0,0 +1 @@
+double-sign-plus = ++99
diff --git a/tests/data/invalid/burntsushi/invalid/integer/double-us.toml b/tests/data/invalid/burntsushi/invalid/integer/double-us.toml
new file mode 100644
index 0000000..cd00561
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/integer/double-us.toml
@@ -0,0 +1 @@
+double-us = 1__23
diff --git a/tests/data/invalid/burntsushi/invalid/integer/integer.multi b/tests/data/invalid/burntsushi/invalid/integer/integer.multi
new file mode 100644
index 0000000..40ac409
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/integer/integer.multi
@@ -0,0 +1,41 @@
+leading-zero-1 = 01
+leading-zero-2 = 00
+leading-zero-3 = 0_0
+leading-zero-sign-1 = -01
+leading-zero-sign-2 = +01
+leading-zero-sign-3 = +0_1
+
+double-sign-plus = ++99
+double-sign-nex = --99
+
+negative-hex = -0xff
+negative-bin = -0b11010110
+negative-oct = -0o99
+
+positive-hex = +0xff
+positive-bin = +0b11010110
+positive-oct = +0o99
+
+trailing-us = 123_
+leading-us = _123
+double-us = 1__23
+
+us-after-hex = 0x_1
+us-after-oct = 0o_1
+us-after-bin = 0b_1
+
+trailing-us-hex = 0x1_
+trailing-us-oct = 0o1_
+trailing-us-bin = 0b1_
+
+leading-us-hex = _0o1
+leading-us-oct = _0o1
+leading-us-bin = _0o1
+
+invalid-hex = 0xaafz
+invalid-oct = 0o778
+invalid-bin = 0b0012
+
+capital-hex = 0X1
+capital-oct = 0O0
+capital-bin = 0B0
diff --git a/tests/data/invalid/burntsushi/invalid/integer/invalid-bin.toml b/tests/data/invalid/burntsushi/invalid/integer/invalid-bin.toml
new file mode 100644
index 0000000..d018258
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/integer/invalid-bin.toml
@@ -0,0 +1 @@
+invalid-bin = 0b0012
diff --git a/tests/data/invalid/burntsushi/invalid/integer/invalid-hex.toml b/tests/data/invalid/burntsushi/invalid/integer/invalid-hex.toml
new file mode 100644
index 0000000..7cc0e85
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/integer/invalid-hex.toml
@@ -0,0 +1 @@
+invalid-hex = 0xaafz
diff --git a/tests/data/invalid/burntsushi/invalid/integer/invalid-oct.toml b/tests/data/invalid/burntsushi/invalid/integer/invalid-oct.toml
new file mode 100644
index 0000000..03181b1
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/integer/invalid-oct.toml
@@ -0,0 +1 @@
+invalid-oct = 0o778
diff --git a/tests/data/invalid/burntsushi/invalid/integer/leading-us-bin.toml b/tests/data/invalid/burntsushi/invalid/integer/leading-us-bin.toml
new file mode 100644
index 0000000..8885c03
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/integer/leading-us-bin.toml
@@ -0,0 +1 @@
+leading-us-bin = _0o1
diff --git a/tests/data/invalid/burntsushi/invalid/integer/leading-us-hex.toml b/tests/data/invalid/burntsushi/invalid/integer/leading-us-hex.toml
new file mode 100644
index 0000000..9f193f8
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/integer/leading-us-hex.toml
@@ -0,0 +1 @@
+leading-us-hex = _0o1
diff --git a/tests/data/invalid/burntsushi/invalid/integer/leading-us-oct.toml b/tests/data/invalid/burntsushi/invalid/integer/leading-us-oct.toml
new file mode 100644
index 0000000..a717f1c
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/integer/leading-us-oct.toml
@@ -0,0 +1 @@
+leading-us-oct = _0o1
diff --git a/tests/data/invalid/burntsushi/invalid/integer/leading-us.toml b/tests/data/invalid/burntsushi/invalid/integer/leading-us.toml
new file mode 100644
index 0000000..d059f50
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/integer/leading-us.toml
@@ -0,0 +1 @@
+leading-us = _123
diff --git a/tests/data/invalid/burntsushi/invalid/integer/leading-zero-1.toml b/tests/data/invalid/burntsushi/invalid/integer/leading-zero-1.toml
new file mode 100644
index 0000000..eba6bda
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/integer/leading-zero-1.toml
@@ -0,0 +1 @@
+leading-zero-1 = 01
diff --git a/tests/data/invalid/burntsushi/invalid/integer/leading-zero-2.toml b/tests/data/invalid/burntsushi/invalid/integer/leading-zero-2.toml
new file mode 100644
index 0000000..436af56
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/integer/leading-zero-2.toml
@@ -0,0 +1 @@
+leading-zero-2 = 00
diff --git a/tests/data/invalid/burntsushi/invalid/integer/leading-zero-3.toml b/tests/data/invalid/burntsushi/invalid/integer/leading-zero-3.toml
new file mode 100644
index 0000000..5404fc8
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/integer/leading-zero-3.toml
@@ -0,0 +1 @@
+leading-zero-3 = 0_0
diff --git a/tests/data/invalid/burntsushi/invalid/integer/leading-zero-sign-1.toml b/tests/data/invalid/burntsushi/invalid/integer/leading-zero-sign-1.toml
new file mode 100644
index 0000000..1f15a9d
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/integer/leading-zero-sign-1.toml
@@ -0,0 +1 @@
+leading-zero-sign-1 = -01
diff --git a/tests/data/invalid/burntsushi/invalid/integer/leading-zero-sign-2.toml b/tests/data/invalid/burntsushi/invalid/integer/leading-zero-sign-2.toml
new file mode 100644
index 0000000..fa259c3
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/integer/leading-zero-sign-2.toml
@@ -0,0 +1 @@
+leading-zero-sign-2 = +01
diff --git a/tests/data/invalid/burntsushi/invalid/integer/leading-zero-sign-3.toml b/tests/data/invalid/burntsushi/invalid/integer/leading-zero-sign-3.toml
new file mode 100644
index 0000000..3ac64a5
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/integer/leading-zero-sign-3.toml
@@ -0,0 +1 @@
+leading-zero-sign-3 = +0_1
diff --git a/tests/data/invalid/burntsushi/invalid/integer/negative-bin.toml b/tests/data/invalid/burntsushi/invalid/integer/negative-bin.toml
new file mode 100644
index 0000000..948b236
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/integer/negative-bin.toml
@@ -0,0 +1 @@
+negative-bin = -0b11010110
diff --git a/tests/data/invalid/burntsushi/invalid/integer/negative-hex.toml b/tests/data/invalid/burntsushi/invalid/integer/negative-hex.toml
new file mode 100644
index 0000000..67c31ea
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/integer/negative-hex.toml
@@ -0,0 +1 @@
+negative-hex = -0xff
diff --git a/tests/data/invalid/burntsushi/invalid/integer/negative-oct.toml b/tests/data/invalid/burntsushi/invalid/integer/negative-oct.toml
new file mode 100644
index 0000000..b0c5ab0
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/integer/negative-oct.toml
@@ -0,0 +1 @@
+negative-oct = -0o99
diff --git a/tests/data/invalid/burntsushi/invalid/integer/positive-bin.toml b/tests/data/invalid/burntsushi/invalid/integer/positive-bin.toml
new file mode 100644
index 0000000..7d6de65
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/integer/positive-bin.toml
@@ -0,0 +1 @@
+positive-bin = +0b11010110
diff --git a/tests/data/invalid/burntsushi/invalid/integer/positive-hex.toml b/tests/data/invalid/burntsushi/invalid/integer/positive-hex.toml
new file mode 100644
index 0000000..bd503aa
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/integer/positive-hex.toml
@@ -0,0 +1 @@
+positive-hex = +0xff
diff --git a/tests/data/invalid/burntsushi/invalid/integer/positive-oct.toml b/tests/data/invalid/burntsushi/invalid/integer/positive-oct.toml
new file mode 100644
index 0000000..d77aa52
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/integer/positive-oct.toml
@@ -0,0 +1 @@
+positive-oct = +0o99
diff --git a/tests/data/invalid/burntsushi/invalid/integer/text-after-integer.toml b/tests/data/invalid/burntsushi/invalid/integer/text-after-integer.toml
new file mode 100644
index 0000000..42de7af
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/integer/text-after-integer.toml
@@ -0,0 +1 @@
+answer = 42 the ultimate answer?
diff --git a/tests/data/invalid/burntsushi/invalid/integer/trailing-us-bin.toml b/tests/data/invalid/burntsushi/invalid/integer/trailing-us-bin.toml
new file mode 100644
index 0000000..9a0b574
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/integer/trailing-us-bin.toml
@@ -0,0 +1 @@
+trailing-us-bin = 0b1_
diff --git a/tests/data/invalid/burntsushi/invalid/integer/trailing-us-hex.toml b/tests/data/invalid/burntsushi/invalid/integer/trailing-us-hex.toml
new file mode 100644
index 0000000..2a96455
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/integer/trailing-us-hex.toml
@@ -0,0 +1 @@
+trailing-us-hex = 0x1_
diff --git a/tests/data/invalid/burntsushi/invalid/integer/trailing-us-oct.toml b/tests/data/invalid/burntsushi/invalid/integer/trailing-us-oct.toml
new file mode 100644
index 0000000..d28e8bc
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/integer/trailing-us-oct.toml
@@ -0,0 +1 @@
+trailing-us-oct = 0o1_
diff --git a/tests/data/invalid/burntsushi/invalid/integer/trailing-us.toml b/tests/data/invalid/burntsushi/invalid/integer/trailing-us.toml
new file mode 100644
index 0000000..e11e8ff
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/integer/trailing-us.toml
@@ -0,0 +1 @@
+trailing-us = 123_
diff --git a/tests/data/invalid/burntsushi/invalid/integer/us-after-bin.toml b/tests/data/invalid/burntsushi/invalid/integer/us-after-bin.toml
new file mode 100644
index 0000000..61dd895
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/integer/us-after-bin.toml
@@ -0,0 +1 @@
+us-after-bin = 0b_1
diff --git a/tests/data/invalid/burntsushi/invalid/integer/us-after-hex.toml b/tests/data/invalid/burntsushi/invalid/integer/us-after-hex.toml
new file mode 100644
index 0000000..200220a
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/integer/us-after-hex.toml
@@ -0,0 +1 @@
+us-after-hex = 0x_1
diff --git a/tests/data/invalid/burntsushi/invalid/integer/us-after-oct.toml b/tests/data/invalid/burntsushi/invalid/integer/us-after-oct.toml
new file mode 100644
index 0000000..23f5300
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/integer/us-after-oct.toml
@@ -0,0 +1 @@
+us-after-oct = 0o_1
diff --git a/tests/data/invalid/burntsushi/invalid/key/after-array.toml b/tests/data/invalid/burntsushi/invalid/key/after-array.toml
new file mode 100644
index 0000000..5c1a1b0
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/key/after-array.toml
@@ -0,0 +1 @@
+[[agencies]] owner = "S Cjelli"
diff --git a/tests/data/invalid/burntsushi/invalid/key/after-table.toml b/tests/data/invalid/burntsushi/invalid/key/after-table.toml
new file mode 100644
index 0000000..6886784
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/key/after-table.toml
@@ -0,0 +1 @@
+[error] this = "should not be here"
diff --git a/tests/data/invalid/burntsushi/invalid/key/after-value.toml b/tests/data/invalid/burntsushi/invalid/key/after-value.toml
new file mode 100644
index 0000000..e05c47c
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/key/after-value.toml
@@ -0,0 +1 @@
+first = "Tom" last = "Preston-Werner" # INVALID
diff --git a/tests/data/invalid/burntsushi/invalid/key/bare-invalid-character.toml b/tests/data/invalid/burntsushi/invalid/key/bare-invalid-character.toml
new file mode 100644
index 0000000..e50dbe3
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/key/bare-invalid-character.toml
@@ -0,0 +1 @@
+bare!key = 123
diff --git a/tests/data/invalid/burntsushi/invalid/key/dotted-redefine-table.toml b/tests/data/invalid/burntsushi/invalid/key/dotted-redefine-table.toml
new file mode 100644
index 0000000..55e25ac
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/key/dotted-redefine-table.toml
@@ -0,0 +1,4 @@
+# Defined a.b as int
+a.b = 1
+# Tries to access it as table: error
+a.b.c = 2
diff --git a/tests/data/invalid/burntsushi/invalid/key/duplicate-keys.toml b/tests/data/invalid/burntsushi/invalid/key/duplicate-keys.toml
new file mode 100644
index 0000000..9b5aee0
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/key/duplicate-keys.toml
@@ -0,0 +1,2 @@
+dupe = false
+dupe = true
diff --git a/tests/data/invalid/burntsushi/invalid/key/duplicate.toml b/tests/data/invalid/burntsushi/invalid/key/duplicate.toml
new file mode 100644
index 0000000..7847bd4
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/key/duplicate.toml
@@ -0,0 +1,3 @@
+# DO NOT DO THIS
+name = "Tom"
+name = "Pradyun"
diff --git a/tests/data/invalid/burntsushi/invalid/key/empty.toml b/tests/data/invalid/burntsushi/invalid/key/empty.toml
new file mode 100644
index 0000000..09f998f
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/key/empty.toml
@@ -0,0 +1 @@
+ = 1
diff --git a/tests/data/invalid/burntsushi/invalid/key/escape.toml b/tests/data/invalid/burntsushi/invalid/key/escape.toml
new file mode 100644
index 0000000..cdb8f4d
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/key/escape.toml
@@ -0,0 +1 @@
+\u00c0 = "latin capital letter A with grave"
diff --git a/tests/data/invalid/burntsushi/invalid/key/hash.toml b/tests/data/invalid/burntsushi/invalid/key/hash.toml
new file mode 100644
index 0000000..e321b1f
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/key/hash.toml
@@ -0,0 +1 @@
+a# = 1
diff --git a/tests/data/invalid/burntsushi/invalid/key/multiline.toml b/tests/data/invalid/burntsushi/invalid/key/multiline.toml
new file mode 100644
index 0000000..31ff67e
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/key/multiline.toml
@@ -0,0 +1,2 @@
+"""long
+key""" = 1
diff --git a/tests/data/invalid/burntsushi/invalid/key/newline.toml b/tests/data/invalid/burntsushi/invalid/key/newline.toml
new file mode 100644
index 0000000..24acaa1
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/key/newline.toml
@@ -0,0 +1,2 @@
+barekey
+ = 123
diff --git a/tests/data/invalid/burntsushi/invalid/key/no-eol.toml b/tests/data/invalid/burntsushi/invalid/key/no-eol.toml
new file mode 100644
index 0000000..3c58eee
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/key/no-eol.toml
@@ -0,0 +1 @@
+a = 1 b = 2
diff --git a/tests/data/invalid/burntsushi/invalid/key/open-bracket.toml b/tests/data/invalid/burntsushi/invalid/key/open-bracket.toml
new file mode 100644
index 0000000..f0aeb16
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/key/open-bracket.toml
@@ -0,0 +1 @@
+[abc = 1
diff --git a/tests/data/invalid/burntsushi/invalid/key/partial-quoted.toml b/tests/data/invalid/burntsushi/invalid/key/partial-quoted.toml
new file mode 100644
index 0000000..e491a2f
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/key/partial-quoted.toml
@@ -0,0 +1 @@
+partial"quoted" = 5
diff --git a/tests/data/invalid/burntsushi/invalid/key/single-open-bracket.toml b/tests/data/invalid/burntsushi/invalid/key/single-open-bracket.toml
new file mode 100644
index 0000000..558ed37
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/key/single-open-bracket.toml
@@ -0,0 +1 @@
+[
diff --git a/tests/data/invalid/burntsushi/invalid/key/space.toml b/tests/data/invalid/burntsushi/invalid/key/space.toml
new file mode 100644
index 0000000..7c22703
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/key/space.toml
@@ -0,0 +1 @@
+a b = 1
diff --git a/tests/data/invalid/burntsushi/invalid/key/special-character.toml b/tests/data/invalid/burntsushi/invalid/key/special-character.toml
new file mode 100644
index 0000000..bc181a5
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/key/special-character.toml
@@ -0,0 +1 @@
+μ = "greek small letter mu"
diff --git a/tests/data/invalid/burntsushi/invalid/key/start-bracket.toml b/tests/data/invalid/burntsushi/invalid/key/start-bracket.toml
new file mode 100644
index 0000000..e0597ae
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/key/start-bracket.toml
@@ -0,0 +1,3 @@
+[a]
+[xyz = 5
+[b]
diff --git a/tests/data/invalid/burntsushi/invalid/key/two-equals.toml b/tests/data/invalid/burntsushi/invalid/key/two-equals.toml
new file mode 100644
index 0000000..25a0378
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/key/two-equals.toml
@@ -0,0 +1 @@
+key= = 1
diff --git a/tests/data/invalid/burntsushi/invalid/key/two-equals2.toml b/tests/data/invalid/burntsushi/invalid/key/two-equals2.toml
new file mode 100644
index 0000000..c5f2de8
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/key/two-equals2.toml
@@ -0,0 +1 @@
+a==1
diff --git a/tests/data/invalid/burntsushi/invalid/key/two-equals3.toml b/tests/data/invalid/burntsushi/invalid/key/two-equals3.toml
new file mode 100644
index 0000000..eb20372
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/key/two-equals3.toml
@@ -0,0 +1 @@
+a=b=1
diff --git a/tests/data/invalid/burntsushi/invalid/key/without-value-1.toml b/tests/data/invalid/burntsushi/invalid/key/without-value-1.toml
new file mode 100644
index 0000000..06bfde4
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/key/without-value-1.toml
@@ -0,0 +1 @@
+key
diff --git a/tests/data/invalid/burntsushi/invalid/key/without-value-2.toml b/tests/data/invalid/burntsushi/invalid/key/without-value-2.toml
new file mode 100644
index 0000000..ca6d7eb
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/key/without-value-2.toml
@@ -0,0 +1 @@
+key =
diff --git a/tests/data/invalid/burntsushi/invalid/string/bad-byte-escape.toml b/tests/data/invalid/burntsushi/invalid/string/bad-byte-escape.toml
new file mode 100644
index 0000000..4c7be59
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/string/bad-byte-escape.toml
@@ -0,0 +1 @@
+naughty = "\xAg"
diff --git a/tests/data/invalid/burntsushi/invalid/string/bad-codepoint.toml b/tests/data/invalid/burntsushi/invalid/string/bad-codepoint.toml
new file mode 100644
index 0000000..592db75
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/string/bad-codepoint.toml
@@ -0,0 +1 @@
+invalid-codepoint = "This string contains a non scalar unicode codepoint \uD801"
diff --git a/tests/data/invalid/burntsushi/invalid/string/bad-concat.toml b/tests/data/invalid/burntsushi/invalid/string/bad-concat.toml
new file mode 100644
index 0000000..fc6d3c9
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/string/bad-concat.toml
@@ -0,0 +1 @@
+no_concat = "first" "second"
diff --git a/tests/data/invalid/burntsushi/invalid/string/bad-escape-1.toml b/tests/data/invalid/burntsushi/invalid/string/bad-escape-1.toml
new file mode 100644
index 0000000..60acb0c
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/string/bad-escape-1.toml
@@ -0,0 +1 @@
+invalid-escape = "This string has a bad \a escape character."
diff --git a/tests/data/invalid/burntsushi/invalid/string/bad-escape-2.toml b/tests/data/invalid/burntsushi/invalid/string/bad-escape-2.toml
new file mode 100644
index 0000000..2a20d8c
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/string/bad-escape-2.toml
@@ -0,0 +1,2 @@
+invalid-escape = "This string has a bad \ escape character."
+
diff --git a/tests/data/invalid/burntsushi/invalid/string/bad-multiline.toml b/tests/data/invalid/burntsushi/invalid/string/bad-multiline.toml
new file mode 100644
index 0000000..786046b
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/string/bad-multiline.toml
@@ -0,0 +1,2 @@
+multi = "first line
+second line"
diff --git a/tests/data/invalid/burntsushi/invalid/string/bad-slash-escape.toml b/tests/data/invalid/burntsushi/invalid/string/bad-slash-escape.toml
new file mode 100644
index 0000000..154abad
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/string/bad-slash-escape.toml
@@ -0,0 +1 @@
+invalid-escape = "This string has a bad \/ escape character."
diff --git a/tests/data/invalid/burntsushi/invalid/string/bad-uni-esc.toml b/tests/data/invalid/burntsushi/invalid/string/bad-uni-esc.toml
new file mode 100644
index 0000000..9eae4ab
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/string/bad-uni-esc.toml
@@ -0,0 +1 @@
+str = "val\ue"
diff --git a/tests/data/invalid/burntsushi/invalid/string/basic-byte-escapes.toml b/tests/data/invalid/burntsushi/invalid/string/basic-byte-escapes.toml
new file mode 100644
index 0000000..e94452a
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/string/basic-byte-escapes.toml
@@ -0,0 +1 @@
+answer = "\x33"
diff --git a/tests/data/invalid/burntsushi/invalid/string/basic-multiline-out-of-range-unicode-escape-1.toml b/tests/data/invalid/burntsushi/invalid/string/basic-multiline-out-of-range-unicode-escape-1.toml
new file mode 100644
index 0000000..b27e203
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/string/basic-multiline-out-of-range-unicode-escape-1.toml
@@ -0,0 +1 @@
+a = """\UFFFFFFFF"""
diff --git a/tests/data/invalid/burntsushi/invalid/string/basic-multiline-out-of-range-unicode-escape-2.toml b/tests/data/invalid/burntsushi/invalid/string/basic-multiline-out-of-range-unicode-escape-2.toml
new file mode 100644
index 0000000..17a9361
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/string/basic-multiline-out-of-range-unicode-escape-2.toml
@@ -0,0 +1 @@
+a = """\U00D80000"""
diff --git a/tests/data/invalid/burntsushi/invalid/string/basic-multiline-quotes.toml b/tests/data/invalid/burntsushi/invalid/string/basic-multiline-quotes.toml
new file mode 100644
index 0000000..02ebf13
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/string/basic-multiline-quotes.toml
@@ -0,0 +1 @@
+str5 = """Here are three quotation marks: """."""
diff --git a/tests/data/invalid/burntsushi/invalid/string/basic-multiline-unknown-escape.toml b/tests/data/invalid/burntsushi/invalid/string/basic-multiline-unknown-escape.toml
new file mode 100644
index 0000000..35c5cc5
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/string/basic-multiline-unknown-escape.toml
@@ -0,0 +1 @@
+a = """\@"""
diff --git a/tests/data/invalid/burntsushi/invalid/string/basic-out-of-range-unicode-escape-1.toml b/tests/data/invalid/burntsushi/invalid/string/basic-out-of-range-unicode-escape-1.toml
new file mode 100644
index 0000000..ada1f55
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/string/basic-out-of-range-unicode-escape-1.toml
@@ -0,0 +1 @@
+a = "\UFFFFFFFF"
diff --git a/tests/data/invalid/burntsushi/invalid/string/basic-out-of-range-unicode-escape-2.toml b/tests/data/invalid/burntsushi/invalid/string/basic-out-of-range-unicode-escape-2.toml
new file mode 100644
index 0000000..d4833b3
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/string/basic-out-of-range-unicode-escape-2.toml
@@ -0,0 +1 @@
+a = "\U00D80000"
diff --git a/tests/data/invalid/burntsushi/invalid/string/basic-unknown-escape.toml b/tests/data/invalid/burntsushi/invalid/string/basic-unknown-escape.toml
new file mode 100644
index 0000000..381dd85
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/string/basic-unknown-escape.toml
@@ -0,0 +1 @@
+a = "\@"
diff --git a/tests/data/invalid/burntsushi/invalid/string/literal-multiline-quotes-1.toml b/tests/data/invalid/burntsushi/invalid/string/literal-multiline-quotes-1.toml
new file mode 100644
index 0000000..9cfb763
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/string/literal-multiline-quotes-1.toml
@@ -0,0 +1,2 @@
+a = '''6 apostrophes: ''''''
+
diff --git a/tests/data/invalid/burntsushi/invalid/string/literal-multiline-quotes-2.toml b/tests/data/invalid/burntsushi/invalid/string/literal-multiline-quotes-2.toml
new file mode 100644
index 0000000..9924236
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/string/literal-multiline-quotes-2.toml
@@ -0,0 +1 @@
+a = '''15 apostrophes: ''''''''''''''''''
diff --git a/tests/data/invalid/burntsushi/invalid/string/missing-quotes.toml b/tests/data/invalid/burntsushi/invalid/string/missing-quotes.toml
new file mode 100644
index 0000000..2292793
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/string/missing-quotes.toml
@@ -0,0 +1 @@
+name = value
diff --git a/tests/data/invalid/burntsushi/invalid/string/multiline-bad-escape-1.toml b/tests/data/invalid/burntsushi/invalid/string/multiline-bad-escape-1.toml
new file mode 100644
index 0000000..5de9e15
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/string/multiline-bad-escape-1.toml
@@ -0,0 +1,2 @@
+k = """t\a"""
+
diff --git a/tests/data/invalid/burntsushi/invalid/string/multiline-bad-escape-2.toml b/tests/data/invalid/burntsushi/invalid/string/multiline-bad-escape-2.toml
new file mode 100644
index 0000000..3d1ac10
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/string/multiline-bad-escape-2.toml
@@ -0,0 +1,2 @@
+# \<Space> is not a valid escape.
+k = """t\ t"""
diff --git a/tests/data/invalid/burntsushi/invalid/string/multiline-bad-escape-3.toml b/tests/data/invalid/burntsushi/invalid/string/multiline-bad-escape-3.toml
new file mode 100644
index 0000000..95621eb
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/string/multiline-bad-escape-3.toml
@@ -0,0 +1,3 @@
+# \<Space> is not a valid escape.
+k = """t\ """
+
diff --git a/tests/data/invalid/burntsushi/invalid/string/multiline-escape-space.toml b/tests/data/invalid/burntsushi/invalid/string/multiline-escape-space.toml
new file mode 100644
index 0000000..13570d3
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/string/multiline-escape-space.toml
@@ -0,0 +1,3 @@
+a = """
+ foo \ \n
+ bar"""
diff --git a/tests/data/invalid/burntsushi/invalid/string/multiline-no-close-2.toml b/tests/data/invalid/burntsushi/invalid/string/multiline-no-close-2.toml
new file mode 100644
index 0000000..f469402
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/string/multiline-no-close-2.toml
@@ -0,0 +1 @@
+x="""
diff --git a/tests/data/invalid/burntsushi/invalid/string/multiline-no-close.toml b/tests/data/invalid/burntsushi/invalid/string/multiline-no-close.toml
new file mode 100644
index 0000000..4ca9597
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/string/multiline-no-close.toml
@@ -0,0 +1,2 @@
+invalid = """
+ this will fail
diff --git a/tests/data/invalid/burntsushi/invalid/string/multiline-quotes-1.toml b/tests/data/invalid/burntsushi/invalid/string/multiline-quotes-1.toml
new file mode 100644
index 0000000..9f7a42b
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/string/multiline-quotes-1.toml
@@ -0,0 +1 @@
+a = """6 quotes: """"""
diff --git a/tests/data/invalid/burntsushi/invalid/string/multiline-quotes-2.toml b/tests/data/invalid/burntsushi/invalid/string/multiline-quotes-2.toml
new file mode 100644
index 0000000..9f7a42b
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/string/multiline-quotes-2.toml
@@ -0,0 +1 @@
+a = """6 quotes: """"""
diff --git a/tests/data/invalid/burntsushi/invalid/string/no-close.toml b/tests/data/invalid/burntsushi/invalid/string/no-close.toml
new file mode 100644
index 0000000..0c292fc
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/string/no-close.toml
@@ -0,0 +1 @@
+no-ending-quote = "One time, at band camp
diff --git a/tests/data/invalid/burntsushi/invalid/string/text-after-string.toml b/tests/data/invalid/burntsushi/invalid/string/text-after-string.toml
new file mode 100644
index 0000000..c92a6f1
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/string/text-after-string.toml
@@ -0,0 +1 @@
+string = "Is there life after strings?" No.
diff --git a/tests/data/invalid/burntsushi/invalid/string/wrong-close.toml b/tests/data/invalid/burntsushi/invalid/string/wrong-close.toml
new file mode 100644
index 0000000..0f5c801
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/string/wrong-close.toml
@@ -0,0 +1 @@
+bad-ending-quote = "double and single'
diff --git a/tests/data/invalid/burntsushi/invalid/table/append-with-dotted-keys-1.toml b/tests/data/invalid/burntsushi/invalid/table/append-with-dotted-keys-1.toml
new file mode 100644
index 0000000..0b5b4bb
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/table/append-with-dotted-keys-1.toml
@@ -0,0 +1,17 @@
+# First a.b.c defines a table: a.b.c = {z=9}
+#
+# Then we define a.b.c.t = "str" to add a str to the above table, making it:
+#
+# a.b.c = {z=9, t="..."}
+#
+# While this makes sense, logically, it was decided this is not valid TOML as
+# it's too confusing/convoluted.
+#
+# See: https://github.com/toml-lang/toml/issues/846
+# https://github.com/toml-lang/toml/pull/859
+
+[a.b.c]
+ z = 9
+
+[a]
+ b.c.t = "Using dotted keys to add to [a.b.c] after explicitly defining it above is not allowed"
diff --git a/tests/data/invalid/burntsushi/invalid/table/append-with-dotted-keys-2.toml b/tests/data/invalid/burntsushi/invalid/table/append-with-dotted-keys-2.toml
new file mode 100644
index 0000000..3f0a011
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/table/append-with-dotted-keys-2.toml
@@ -0,0 +1,8 @@
+# This is the same issue as in injection-1.toml, except that nests one level
+# deeper. See that file for a more complete description.
+
+[a.b.c.d]
+ z = 9
+
+[a]
+ b.c.d.k.t = "Using dotted keys to add to [a.b.c.d] after explicitly defining it above is not allowed"
diff --git a/tests/data/invalid/burntsushi/invalid/table/array-empty.toml b/tests/data/invalid/burntsushi/invalid/table/array-empty.toml
new file mode 100644
index 0000000..a470ca3
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/table/array-empty.toml
@@ -0,0 +1,2 @@
+[[]]
+name = "Born to Run"
diff --git a/tests/data/invalid/burntsushi/invalid/table/array-implicit.toml b/tests/data/invalid/burntsushi/invalid/table/array-implicit.toml
new file mode 100644
index 0000000..05f2507
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/table/array-implicit.toml
@@ -0,0 +1,14 @@
+# This test is a bit tricky. It should fail because the first use of
+# `[[albums.songs]]` without first declaring `albums` implies that `albums`
+# must be a table. The alternative would be quite weird. Namely, it wouldn't
+# comply with the TOML spec: "Each double-bracketed sub-table will belong to
+# the most *recently* defined table element *above* it."
+#
+# This is in contrast to the *valid* test, table-array-implicit where
+# `[[albums.songs]]` works by itself, so long as `[[albums]]` isn't declared
+# later. (Although, `[albums]` could be.)
+[[albums.songs]]
+name = "Glory Days"
+
+[[albums]]
+name = "Born in the USA"
diff --git a/tests/data/invalid/burntsushi/invalid/table/array-missing-bracket.toml b/tests/data/invalid/burntsushi/invalid/table/array-missing-bracket.toml
new file mode 100644
index 0000000..39c73b0
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/table/array-missing-bracket.toml
@@ -0,0 +1,2 @@
+[[albums]
+name = "Born to Run"
diff --git a/tests/data/invalid/burntsushi/invalid/table/duplicate-key-dotted-table.toml b/tests/data/invalid/burntsushi/invalid/table/duplicate-key-dotted-table.toml
new file mode 100644
index 0000000..ade637b
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/table/duplicate-key-dotted-table.toml
@@ -0,0 +1,4 @@
+[fruit]
+apple.color = "red"
+
+[fruit.apple] # INVALID
diff --git a/tests/data/invalid/burntsushi/invalid/table/duplicate-key-dotted-table2.toml b/tests/data/invalid/burntsushi/invalid/table/duplicate-key-dotted-table2.toml
new file mode 100644
index 0000000..609b660
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/table/duplicate-key-dotted-table2.toml
@@ -0,0 +1,4 @@
+[fruit]
+apple.taste.sweet = true
+
+[fruit.apple.taste] # INVALID
diff --git a/tests/data/invalid/burntsushi/invalid/table/duplicate-key-table.toml b/tests/data/invalid/burntsushi/invalid/table/duplicate-key-table.toml
new file mode 100644
index 0000000..cedf05f
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/table/duplicate-key-table.toml
@@ -0,0 +1,5 @@
+[fruit]
+type = "apple"
+
+[fruit.type]
+apple = "yes"
diff --git a/tests/data/invalid/burntsushi/invalid/table/duplicate-table-array.toml b/tests/data/invalid/burntsushi/invalid/table/duplicate-table-array.toml
new file mode 100644
index 0000000..a1d8705
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/table/duplicate-table-array.toml
@@ -0,0 +1,2 @@
+[tbl]
+[[tbl]]
diff --git a/tests/data/invalid/burntsushi/invalid/table/duplicate-table-array2.toml b/tests/data/invalid/burntsushi/invalid/table/duplicate-table-array2.toml
new file mode 100644
index 0000000..72eacbd
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/table/duplicate-table-array2.toml
@@ -0,0 +1,2 @@
+[[tbl]]
+[tbl]
diff --git a/tests/data/invalid/burntsushi/invalid/table/duplicate.toml b/tests/data/invalid/burntsushi/invalid/table/duplicate.toml
new file mode 100644
index 0000000..73ef1cc
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/table/duplicate.toml
@@ -0,0 +1,5 @@
+[a]
+b = 1
+
+[a]
+c = 2
diff --git a/tests/data/invalid/burntsushi/invalid/table/empty-implicit-table.toml b/tests/data/invalid/burntsushi/invalid/table/empty-implicit-table.toml
new file mode 100644
index 0000000..0cc36d0
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/table/empty-implicit-table.toml
@@ -0,0 +1 @@
+[naughty..naughty]
diff --git a/tests/data/invalid/burntsushi/invalid/table/empty.toml b/tests/data/invalid/burntsushi/invalid/table/empty.toml
new file mode 100644
index 0000000..fe51488
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/table/empty.toml
@@ -0,0 +1 @@
+[]
diff --git a/tests/data/invalid/burntsushi/invalid/table/equals-sign.toml b/tests/data/invalid/burntsushi/invalid/table/equals-sign.toml
new file mode 100644
index 0000000..eb5e742
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/table/equals-sign.toml
@@ -0,0 +1 @@
+[name=bad]
diff --git a/tests/data/invalid/burntsushi/invalid/table/llbrace.toml b/tests/data/invalid/burntsushi/invalid/table/llbrace.toml
new file mode 100644
index 0000000..047978e
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/table/llbrace.toml
@@ -0,0 +1 @@
+[ [table]]
diff --git a/tests/data/invalid/burntsushi/invalid/table/nested-brackets-close.toml b/tests/data/invalid/burntsushi/invalid/table/nested-brackets-close.toml
new file mode 100644
index 0000000..c8b5a67
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/table/nested-brackets-close.toml
@@ -0,0 +1,2 @@
+[a]b]
+zyx = 42
diff --git a/tests/data/invalid/burntsushi/invalid/table/nested-brackets-open.toml b/tests/data/invalid/burntsushi/invalid/table/nested-brackets-open.toml
new file mode 100644
index 0000000..246d7e9
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/table/nested-brackets-open.toml
@@ -0,0 +1,2 @@
+[a[b]
+zyx = 42
diff --git a/tests/data/invalid/burntsushi/invalid/table/quoted-no-close.toml b/tests/data/invalid/burntsushi/invalid/table/quoted-no-close.toml
new file mode 100644
index 0000000..6e7c1a1
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/table/quoted-no-close.toml
@@ -0,0 +1,2 @@
+["where will it end]
+name = value
diff --git a/tests/data/invalid/burntsushi/invalid/table/redefine.toml b/tests/data/invalid/burntsushi/invalid/table/redefine.toml
new file mode 100644
index 0000000..fc23bf7
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/table/redefine.toml
@@ -0,0 +1,6 @@
+# Define b as int, and try to use it as a table: error
+[a]
+b = 1
+
+[a.b]
+c = 2
diff --git a/tests/data/invalid/burntsushi/invalid/table/rrbrace.toml b/tests/data/invalid/burntsushi/invalid/table/rrbrace.toml
new file mode 100644
index 0000000..3a4dee4
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/table/rrbrace.toml
@@ -0,0 +1 @@
+[[table] ]
diff --git a/tests/data/invalid/burntsushi/invalid/table/text-after-table.toml b/tests/data/invalid/burntsushi/invalid/table/text-after-table.toml
new file mode 100644
index 0000000..87da9db
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/table/text-after-table.toml
@@ -0,0 +1 @@
+[error] this shouldn't be here
diff --git a/tests/data/invalid/burntsushi/invalid/table/whitespace.toml b/tests/data/invalid/burntsushi/invalid/table/whitespace.toml
new file mode 100644
index 0000000..0a6a6a6
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/table/whitespace.toml
@@ -0,0 +1 @@
+[invalid key]
diff --git a/tests/data/invalid/burntsushi/invalid/table/with-pound.toml b/tests/data/invalid/burntsushi/invalid/table/with-pound.toml
new file mode 100644
index 0000000..e7b777e
--- /dev/null
+++ b/tests/data/invalid/burntsushi/invalid/table/with-pound.toml
@@ -0,0 +1,2 @@
+[key#group]
+answer = 42
diff --git a/tests/data/invalid/dates-and-times/invalid-day.toml b/tests/data/invalid/dates-and-times/invalid-day.toml
new file mode 100644
index 0000000..c69f091
--- /dev/null
+++ b/tests/data/invalid/dates-and-times/invalid-day.toml
@@ -0,0 +1 @@
+"only 28 or 29 days in february" = 1988-02-30
diff --git a/tests/data/invalid/dotted-keys/access-non-table.toml b/tests/data/invalid/dotted-keys/access-non-table.toml
new file mode 100644
index 0000000..ada0200
--- /dev/null
+++ b/tests/data/invalid/dotted-keys/access-non-table.toml
@@ -0,0 +1,2 @@
+a = false
+a.b = true \ No newline at end of file
diff --git a/tests/data/invalid/dotted-keys/extend-defined-aot.toml b/tests/data/invalid/dotted-keys/extend-defined-aot.toml
new file mode 100644
index 0000000..1c3c34b
--- /dev/null
+++ b/tests/data/invalid/dotted-keys/extend-defined-aot.toml
@@ -0,0 +1,3 @@
+[[tab.arr]]
+[tab]
+arr.val1=1
diff --git a/tests/data/invalid/dotted-keys/extend-defined-table-with-subtable.toml b/tests/data/invalid/dotted-keys/extend-defined-table-with-subtable.toml
new file mode 100644
index 0000000..70e2ac5
--- /dev/null
+++ b/tests/data/invalid/dotted-keys/extend-defined-table-with-subtable.toml
@@ -0,0 +1,4 @@
+[a.b.c.d]
+ z = 9
+[a]
+ b.c.d.k.t = 8
diff --git a/tests/data/invalid/dotted-keys/extend-defined-table.toml b/tests/data/invalid/dotted-keys/extend-defined-table.toml
new file mode 100644
index 0000000..c88c179
--- /dev/null
+++ b/tests/data/invalid/dotted-keys/extend-defined-table.toml
@@ -0,0 +1,4 @@
+[a.b.c]
+ z = 9
+[a]
+ b.c.t = 9
diff --git a/tests/data/invalid/inline-table-missing-comma.toml b/tests/data/invalid/inline-table-missing-comma.toml
new file mode 100644
index 0000000..d98b41d
--- /dev/null
+++ b/tests/data/invalid/inline-table-missing-comma.toml
@@ -0,0 +1 @@
+arrr = { comma-missing = true valid-toml = false }
diff --git a/tests/data/invalid/inline-table/define-twice-in-subtable.toml b/tests/data/invalid/inline-table/define-twice-in-subtable.toml
new file mode 100644
index 0000000..7068341
--- /dev/null
+++ b/tests/data/invalid/inline-table/define-twice-in-subtable.toml
@@ -0,0 +1 @@
+table1 = { table2.dupe = 1, table2.dupe = 2 } \ No newline at end of file
diff --git a/tests/data/invalid/inline-table/define-twice.toml b/tests/data/invalid/inline-table/define-twice.toml
new file mode 100644
index 0000000..8202b98
--- /dev/null
+++ b/tests/data/invalid/inline-table/define-twice.toml
@@ -0,0 +1 @@
+table = { dupe = 1, dupe = 2 } \ No newline at end of file
diff --git a/tests/data/invalid/inline-table/file-end-after-key-val.toml b/tests/data/invalid/inline-table/file-end-after-key-val.toml
new file mode 100644
index 0000000..52d4e77
--- /dev/null
+++ b/tests/data/invalid/inline-table/file-end-after-key-val.toml
@@ -0,0 +1 @@
+a={b=1 \ No newline at end of file
diff --git a/tests/data/invalid/inline-table/mutate.toml b/tests/data/invalid/inline-table/mutate.toml
new file mode 100644
index 0000000..4e5e9ff
--- /dev/null
+++ b/tests/data/invalid/inline-table/mutate.toml
@@ -0,0 +1,2 @@
+a = { b = 1 }
+a.b = 2 \ No newline at end of file
diff --git a/tests/data/invalid/inline-table/override-val-in-table.toml b/tests/data/invalid/inline-table/override-val-in-table.toml
new file mode 100644
index 0000000..6e87cfa
--- /dev/null
+++ b/tests/data/invalid/inline-table/override-val-in-table.toml
@@ -0,0 +1,5 @@
+[tab.nested]
+inline-t = { nest = {} }
+
+[tab]
+nested.inline-t.nest = 2
diff --git a/tests/data/invalid/inline-table/override-val-with-array.toml b/tests/data/invalid/inline-table/override-val-with-array.toml
new file mode 100644
index 0000000..79b4f32
--- /dev/null
+++ b/tests/data/invalid/inline-table/override-val-with-array.toml
@@ -0,0 +1,3 @@
+inline-t = { nest = {} }
+
+[[inline-t.nest]]
diff --git a/tests/data/invalid/inline-table/override-val-with-table.toml b/tests/data/invalid/inline-table/override-val-with-table.toml
new file mode 100644
index 0000000..d0cd6b6
--- /dev/null
+++ b/tests/data/invalid/inline-table/override-val-with-table.toml
@@ -0,0 +1,3 @@
+inline-t = { nest = {} }
+
+[inline-t.nest]
diff --git a/tests/data/invalid/inline-table/overwrite-implicitly.toml b/tests/data/invalid/inline-table/overwrite-implicitly.toml
new file mode 100644
index 0000000..462c28f
--- /dev/null
+++ b/tests/data/invalid/inline-table/overwrite-implicitly.toml
@@ -0,0 +1 @@
+a = { b = 1, b.c = 2 }
diff --git a/tests/data/invalid/inline-table/overwrite-value-in-inner-array.toml b/tests/data/invalid/inline-table/overwrite-value-in-inner-array.toml
new file mode 100644
index 0000000..34ddb85
--- /dev/null
+++ b/tests/data/invalid/inline-table/overwrite-value-in-inner-array.toml
@@ -0,0 +1 @@
+tab = { inner.table = [{}], inner.table.val = "bad" } \ No newline at end of file
diff --git a/tests/data/invalid/inline-table/overwrite-value-in-inner-table.toml b/tests/data/invalid/inline-table/overwrite-value-in-inner-table.toml
new file mode 100644
index 0000000..750853f
--- /dev/null
+++ b/tests/data/invalid/inline-table/overwrite-value-in-inner-table.toml
@@ -0,0 +1 @@
+tab = { inner = { dog = "best" }, inner.cat = "worst" } \ No newline at end of file
diff --git a/tests/data/invalid/inline-table/unclosed-empty.toml b/tests/data/invalid/inline-table/unclosed-empty.toml
new file mode 100644
index 0000000..032edb7
--- /dev/null
+++ b/tests/data/invalid/inline-table/unclosed-empty.toml
@@ -0,0 +1 @@
+a={ \ No newline at end of file
diff --git a/tests/data/invalid/invalid-comment-char.toml b/tests/data/invalid/invalid-comment-char.toml
new file mode 100644
index 0000000..dc5ae33
--- /dev/null
+++ b/tests/data/invalid/invalid-comment-char.toml
@@ -0,0 +1 @@
+# form feed ( ) not allowed in comments \ No newline at end of file
diff --git a/tests/data/invalid/invalid-escaped-unicode.toml b/tests/data/invalid/invalid-escaped-unicode.toml
new file mode 100644
index 0000000..8feba3a
--- /dev/null
+++ b/tests/data/invalid/invalid-escaped-unicode.toml
@@ -0,0 +1 @@
+escaped-unicode = "\uabag"
diff --git a/tests/data/invalid/invalid-hex.toml b/tests/data/invalid/invalid-hex.toml
new file mode 100644
index 0000000..5c55fe8
--- /dev/null
+++ b/tests/data/invalid/invalid-hex.toml
@@ -0,0 +1 @@
+hex = 0xgabba00f1
diff --git a/tests/data/invalid/keys-and-vals/ends-early-table-def.toml b/tests/data/invalid/keys-and-vals/ends-early-table-def.toml
new file mode 100644
index 0000000..75d43a3
--- /dev/null
+++ b/tests/data/invalid/keys-and-vals/ends-early-table-def.toml
@@ -0,0 +1 @@
+[fwfw.wafw \ No newline at end of file
diff --git a/tests/data/invalid/keys-and-vals/ends-early.toml b/tests/data/invalid/keys-and-vals/ends-early.toml
new file mode 100644
index 0000000..e70e265
--- /dev/null
+++ b/tests/data/invalid/keys-and-vals/ends-early.toml
@@ -0,0 +1 @@
+fs.fw \ No newline at end of file
diff --git a/tests/data/invalid/keys-and-vals/no-value.toml b/tests/data/invalid/keys-and-vals/no-value.toml
new file mode 100644
index 0000000..4f9ab16
--- /dev/null
+++ b/tests/data/invalid/keys-and-vals/no-value.toml
@@ -0,0 +1 @@
+why-no-value= \ No newline at end of file
diff --git a/tests/data/invalid/keys-and-vals/only-ws-after-dot.toml b/tests/data/invalid/keys-and-vals/only-ws-after-dot.toml
new file mode 100644
index 0000000..abe5258
--- /dev/null
+++ b/tests/data/invalid/keys-and-vals/only-ws-after-dot.toml
@@ -0,0 +1 @@
+fs. \ No newline at end of file
diff --git a/tests/data/invalid/keys-and-vals/overwrite-with-deep-table.toml b/tests/data/invalid/keys-and-vals/overwrite-with-deep-table.toml
new file mode 100644
index 0000000..103d928
--- /dev/null
+++ b/tests/data/invalid/keys-and-vals/overwrite-with-deep-table.toml
@@ -0,0 +1,2 @@
+a=1
+[a.b.c.d]
diff --git a/tests/data/invalid/literal-str/unclosed.toml b/tests/data/invalid/literal-str/unclosed.toml
new file mode 100644
index 0000000..b1612aa
--- /dev/null
+++ b/tests/data/invalid/literal-str/unclosed.toml
@@ -0,0 +1 @@
+unclosed='dwdd \ No newline at end of file
diff --git a/tests/data/invalid/missing-closing-double-square-bracket.toml b/tests/data/invalid/missing-closing-double-square-bracket.toml
new file mode 100644
index 0000000..ae1d0d9
--- /dev/null
+++ b/tests/data/invalid/missing-closing-double-square-bracket.toml
@@ -0,0 +1,2 @@
+[[closing-bracket.missing]
+blaa=2
diff --git a/tests/data/invalid/missing-closing-square-bracket.toml b/tests/data/invalid/missing-closing-square-bracket.toml
new file mode 100644
index 0000000..354d016
--- /dev/null
+++ b/tests/data/invalid/missing-closing-square-bracket.toml
@@ -0,0 +1,2 @@
+[closing-bracket.missingö
+blaa=2
diff --git a/tests/data/invalid/multiline-basic-str/carriage-return.toml b/tests/data/invalid/multiline-basic-str/carriage-return.toml
new file mode 100644
index 0000000..4c455cf
--- /dev/null
+++ b/tests/data/invalid/multiline-basic-str/carriage-return.toml
@@ -0,0 +1,2 @@
+s="""cr is not an allowed line ending but we just tried to use it
+""" \ No newline at end of file
diff --git a/tests/data/invalid/multiline-basic-str/escape-only.toml b/tests/data/invalid/multiline-basic-str/escape-only.toml
new file mode 100644
index 0000000..f3bd9fc
--- /dev/null
+++ b/tests/data/invalid/multiline-basic-str/escape-only.toml
@@ -0,0 +1 @@
+bee = """\"""
diff --git a/tests/data/invalid/multiline-basic-str/file-ends-after-opening.toml b/tests/data/invalid/multiline-basic-str/file-ends-after-opening.toml
new file mode 100644
index 0000000..1c2a564
--- /dev/null
+++ b/tests/data/invalid/multiline-basic-str/file-ends-after-opening.toml
@@ -0,0 +1 @@
+a=""" \ No newline at end of file
diff --git a/tests/data/invalid/multiline-basic-str/last-line-escape.toml b/tests/data/invalid/multiline-basic-str/last-line-escape.toml
new file mode 100644
index 0000000..92b22b0
--- /dev/null
+++ b/tests/data/invalid/multiline-basic-str/last-line-escape.toml
@@ -0,0 +1,4 @@
+bee = """
+hee \
+
+gee \ """
diff --git a/tests/data/invalid/multiline-basic-str/unclosed-ends-in-whitespace-escape.toml b/tests/data/invalid/multiline-basic-str/unclosed-ends-in-whitespace-escape.toml
new file mode 100644
index 0000000..3ba7feb
--- /dev/null
+++ b/tests/data/invalid/multiline-basic-str/unclosed-ends-in-whitespace-escape.toml
@@ -0,0 +1,3 @@
+bee = """
+hee
+gee\ \ No newline at end of file
diff --git a/tests/data/invalid/multiline-literal-str/file-ends-after-opening.toml b/tests/data/invalid/multiline-literal-str/file-ends-after-opening.toml
new file mode 100644
index 0000000..9a3924a
--- /dev/null
+++ b/tests/data/invalid/multiline-literal-str/file-ends-after-opening.toml
@@ -0,0 +1 @@
+a=''' \ No newline at end of file
diff --git a/tests/data/invalid/multiline-literal-str/unclosed.toml b/tests/data/invalid/multiline-literal-str/unclosed.toml
new file mode 100644
index 0000000..decd378
--- /dev/null
+++ b/tests/data/invalid/multiline-literal-str/unclosed.toml
@@ -0,0 +1,3 @@
+bee = '''
+hee
+gee '' \ No newline at end of file
diff --git a/tests/data/invalid/non-scalar-escaped.toml b/tests/data/invalid/non-scalar-escaped.toml
new file mode 100644
index 0000000..c787f9a
--- /dev/null
+++ b/tests/data/invalid/non-scalar-escaped.toml
@@ -0,0 +1 @@
+a="\ud800" \ No newline at end of file
diff --git a/tests/data/invalid/table/eof-after-opening.toml b/tests/data/invalid/table/eof-after-opening.toml
new file mode 100644
index 0000000..8e2f0be
--- /dev/null
+++ b/tests/data/invalid/table/eof-after-opening.toml
@@ -0,0 +1 @@
+[ \ No newline at end of file
diff --git a/tests/data/invalid/table/redefine-1.toml b/tests/data/invalid/table/redefine-1.toml
new file mode 100644
index 0000000..d2c66eb
--- /dev/null
+++ b/tests/data/invalid/table/redefine-1.toml
@@ -0,0 +1,3 @@
+[t1]
+t2.t3.v = 0
+[t1.t2]
diff --git a/tests/data/invalid/table/redefine-2.toml b/tests/data/invalid/table/redefine-2.toml
new file mode 100644
index 0000000..918017f
--- /dev/null
+++ b/tests/data/invalid/table/redefine-2.toml
@@ -0,0 +1,3 @@
+[t1]
+t2.t3.v = 0
+[t1.t2.t3]
diff --git a/tests/data/invalid/toml-lang-compliance/LICENSE b/tests/data/invalid/toml-lang-compliance/LICENSE
new file mode 100644
index 0000000..cbcecb2
--- /dev/null
+++ b/tests/data/invalid/toml-lang-compliance/LICENSE
@@ -0,0 +1,23 @@
+The MIT License
+
+Copyright (c) 2021 Pradyun Gedam and Contributors
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+
+Portions of the Software include code copyright (c) Rebecca Turner.
diff --git a/tests/data/invalid/toml-lang-compliance/README.md b/tests/data/invalid/toml-lang-compliance/README.md
new file mode 100644
index 0000000..1c2f2e5
--- /dev/null
+++ b/tests/data/invalid/toml-lang-compliance/README.md
@@ -0,0 +1,6 @@
+These test cases are copied from
+https://github.com/pyrmont/toml-specs/tree/989fdfb02f6ca0a9e3b0a09b5e5f5283e02f1fa7
+
+There is an open PR (https://github.com/toml-lang/compliance/pull/8) to merge the tests into
+https://github.com/toml-lang/compliance
+after which we should sync the tests with that repository.
diff --git a/tests/data/invalid/toml-lang-compliance/invalid/array/array-of-tables-1.toml b/tests/data/invalid/toml-lang-compliance/invalid/array/array-of-tables-1.toml
new file mode 100644
index 0000000..01d4d13
--- /dev/null
+++ b/tests/data/invalid/toml-lang-compliance/invalid/array/array-of-tables-1.toml
@@ -0,0 +1,4 @@
+# INVALID TOML DOC
+fruit = []
+
+[[fruit]] # Not allowed
diff --git a/tests/data/invalid/toml-lang-compliance/invalid/array/array-of-tables-2.toml b/tests/data/invalid/toml-lang-compliance/invalid/array/array-of-tables-2.toml
new file mode 100644
index 0000000..a77b0e4
--- /dev/null
+++ b/tests/data/invalid/toml-lang-compliance/invalid/array/array-of-tables-2.toml
@@ -0,0 +1,10 @@
+# INVALID TOML DOC
+[[fruit]]
+ name = "apple"
+
+ [[fruit.variety]]
+ name = "red delicious"
+
+ # This table conflicts with the previous table
+ [fruit.variety]
+ name = "granny smith"
diff --git a/tests/data/invalid/toml-lang-compliance/invalid/comment/comment-control-1.toml b/tests/data/invalid/toml-lang-compliance/invalid/comment/comment-control-1.toml
new file mode 100644
index 0000000..1884b6d
--- /dev/null
+++ b/tests/data/invalid/toml-lang-compliance/invalid/comment/comment-control-1.toml
Binary files differ
diff --git a/tests/data/invalid/toml-lang-compliance/invalid/comment/comment-control-2.toml b/tests/data/invalid/toml-lang-compliance/invalid/comment/comment-control-2.toml
new file mode 100644
index 0000000..ed63dfc
--- /dev/null
+++ b/tests/data/invalid/toml-lang-compliance/invalid/comment/comment-control-2.toml
@@ -0,0 +1 @@
+a = "ctrl-P" # 
diff --git a/tests/data/invalid/toml-lang-compliance/invalid/comment/comment-control-3.toml b/tests/data/invalid/toml-lang-compliance/invalid/comment/comment-control-3.toml
new file mode 100644
index 0000000..9830b75
--- /dev/null
+++ b/tests/data/invalid/toml-lang-compliance/invalid/comment/comment-control-3.toml
@@ -0,0 +1 @@
+a = "ctrl-_" # 
diff --git a/tests/data/invalid/toml-lang-compliance/invalid/comment/comment-control-4.toml b/tests/data/invalid/toml-lang-compliance/invalid/comment/comment-control-4.toml
new file mode 100644
index 0000000..f7fd9bb
--- /dev/null
+++ b/tests/data/invalid/toml-lang-compliance/invalid/comment/comment-control-4.toml
@@ -0,0 +1 @@
+a = "0x7f" # 
diff --git a/tests/data/invalid/toml-lang-compliance/invalid/integer/int-0-padded.toml b/tests/data/invalid/toml-lang-compliance/invalid/integer/int-0-padded.toml
new file mode 100644
index 0000000..74b4032
--- /dev/null
+++ b/tests/data/invalid/toml-lang-compliance/invalid/integer/int-0-padded.toml
@@ -0,0 +1 @@
+int = 0123
diff --git a/tests/data/invalid/toml-lang-compliance/invalid/integer/int-signed-bin.toml b/tests/data/invalid/toml-lang-compliance/invalid/integer/int-signed-bin.toml
new file mode 100644
index 0000000..f9397f1
--- /dev/null
+++ b/tests/data/invalid/toml-lang-compliance/invalid/integer/int-signed-bin.toml
@@ -0,0 +1 @@
+bin = +0b10
diff --git a/tests/data/invalid/toml-lang-compliance/invalid/integer/int-signed-hex.toml b/tests/data/invalid/toml-lang-compliance/invalid/integer/int-signed-hex.toml
new file mode 100644
index 0000000..898b957
--- /dev/null
+++ b/tests/data/invalid/toml-lang-compliance/invalid/integer/int-signed-hex.toml
@@ -0,0 +1 @@
+hex = +0xab
diff --git a/tests/data/invalid/toml-lang-compliance/invalid/integer/int-signed-oct.toml b/tests/data/invalid/toml-lang-compliance/invalid/integer/int-signed-oct.toml
new file mode 100644
index 0000000..e8219cd
--- /dev/null
+++ b/tests/data/invalid/toml-lang-compliance/invalid/integer/int-signed-oct.toml
@@ -0,0 +1 @@
+oct = +0o23
diff --git a/tests/data/invalid/toml-lang-compliance/invalid/key-value/bare-key-1.toml b/tests/data/invalid/toml-lang-compliance/invalid/key-value/bare-key-1.toml
new file mode 100644
index 0000000..e50dbe3
--- /dev/null
+++ b/tests/data/invalid/toml-lang-compliance/invalid/key-value/bare-key-1.toml
@@ -0,0 +1 @@
+bare!key = 123
diff --git a/tests/data/invalid/toml-lang-compliance/invalid/key-value/bare-key-2.toml b/tests/data/invalid/toml-lang-compliance/invalid/key-value/bare-key-2.toml
new file mode 100644
index 0000000..24acaa1
--- /dev/null
+++ b/tests/data/invalid/toml-lang-compliance/invalid/key-value/bare-key-2.toml
@@ -0,0 +1,2 @@
+barekey
+ = 123
diff --git a/tests/data/invalid/toml-lang-compliance/invalid/key-value/bare-key-3.toml b/tests/data/invalid/toml-lang-compliance/invalid/key-value/bare-key-3.toml
new file mode 100644
index 0000000..03d0e0d
--- /dev/null
+++ b/tests/data/invalid/toml-lang-compliance/invalid/key-value/bare-key-3.toml
@@ -0,0 +1 @@
+barekey =
diff --git a/tests/data/invalid/toml-lang-compliance/invalid/key-value/key-value-pair-1.toml b/tests/data/invalid/toml-lang-compliance/invalid/key-value/key-value-pair-1.toml
new file mode 100644
index 0000000..56f085a
--- /dev/null
+++ b/tests/data/invalid/toml-lang-compliance/invalid/key-value/key-value-pair-1.toml
@@ -0,0 +1 @@
+key = # INVALID
diff --git a/tests/data/invalid/toml-lang-compliance/invalid/key-value/key-value-pair-2.toml b/tests/data/invalid/toml-lang-compliance/invalid/key-value/key-value-pair-2.toml
new file mode 100644
index 0000000..e05c47c
--- /dev/null
+++ b/tests/data/invalid/toml-lang-compliance/invalid/key-value/key-value-pair-2.toml
@@ -0,0 +1 @@
+first = "Tom" last = "Preston-Werner" # INVALID
diff --git a/tests/data/invalid/toml-lang-compliance/invalid/key-value/multiple-dot-key.toml b/tests/data/invalid/toml-lang-compliance/invalid/key-value/multiple-dot-key.toml
new file mode 100644
index 0000000..a6c5ea6
--- /dev/null
+++ b/tests/data/invalid/toml-lang-compliance/invalid/key-value/multiple-dot-key.toml
@@ -0,0 +1,8 @@
+# THE FOLLOWING IS INVALID
+
+# This defines the value of fruit.apple to be an integer.
+fruit.apple = 1
+
+# But then this treats fruit.apple like it's a table.
+# You can't turn an integer into a table.
+fruit.apple.smooth = true
diff --git a/tests/data/invalid/toml-lang-compliance/invalid/key-value/multiple-key.toml b/tests/data/invalid/toml-lang-compliance/invalid/key-value/multiple-key.toml
new file mode 100644
index 0000000..7847bd4
--- /dev/null
+++ b/tests/data/invalid/toml-lang-compliance/invalid/key-value/multiple-key.toml
@@ -0,0 +1,3 @@
+# DO NOT DO THIS
+name = "Tom"
+name = "Pradyun"
diff --git a/tests/data/invalid/toml-lang-compliance/invalid/key-value/no-key-name.toml b/tests/data/invalid/toml-lang-compliance/invalid/key-value/no-key-name.toml
new file mode 100644
index 0000000..cd9fa90
--- /dev/null
+++ b/tests/data/invalid/toml-lang-compliance/invalid/key-value/no-key-name.toml
@@ -0,0 +1 @@
+= "no key name" # INVALID
diff --git a/tests/data/invalid/toml-lang-compliance/invalid/string/string-basic-control-1.toml b/tests/data/invalid/toml-lang-compliance/invalid/string/string-basic-control-1.toml
new file mode 100644
index 0000000..351f8c7
--- /dev/null
+++ b/tests/data/invalid/toml-lang-compliance/invalid/string/string-basic-control-1.toml
Binary files differ
diff --git a/tests/data/invalid/toml-lang-compliance/invalid/string/string-basic-control-2.toml b/tests/data/invalid/toml-lang-compliance/invalid/string/string-basic-control-2.toml
new file mode 100644
index 0000000..166e7ff
--- /dev/null
+++ b/tests/data/invalid/toml-lang-compliance/invalid/string/string-basic-control-2.toml
@@ -0,0 +1 @@
+a = "ctrl-P"
diff --git a/tests/data/invalid/toml-lang-compliance/invalid/string/string-basic-control-3.toml b/tests/data/invalid/toml-lang-compliance/invalid/string/string-basic-control-3.toml
new file mode 100644
index 0000000..904751f
--- /dev/null
+++ b/tests/data/invalid/toml-lang-compliance/invalid/string/string-basic-control-3.toml
@@ -0,0 +1 @@
+a = "ctrl-_"
diff --git a/tests/data/invalid/toml-lang-compliance/invalid/string/string-basic-control-4.toml b/tests/data/invalid/toml-lang-compliance/invalid/string/string-basic-control-4.toml
new file mode 100644
index 0000000..f778604
--- /dev/null
+++ b/tests/data/invalid/toml-lang-compliance/invalid/string/string-basic-control-4.toml
@@ -0,0 +1 @@
+a = "0x7f"
diff --git a/tests/data/invalid/toml-lang-compliance/invalid/string/string-basic-multiline-control-1.toml b/tests/data/invalid/toml-lang-compliance/invalid/string/string-basic-multiline-control-1.toml
new file mode 100644
index 0000000..5b45dcd
--- /dev/null
+++ b/tests/data/invalid/toml-lang-compliance/invalid/string/string-basic-multiline-control-1.toml
Binary files differ
diff --git a/tests/data/invalid/toml-lang-compliance/invalid/string/string-basic-multiline-control-2.toml b/tests/data/invalid/toml-lang-compliance/invalid/string/string-basic-multiline-control-2.toml
new file mode 100644
index 0000000..bb7eeb6
--- /dev/null
+++ b/tests/data/invalid/toml-lang-compliance/invalid/string/string-basic-multiline-control-2.toml
@@ -0,0 +1 @@
+a = """null"""
diff --git a/tests/data/invalid/toml-lang-compliance/invalid/string/string-basic-multiline-control-3.toml b/tests/data/invalid/toml-lang-compliance/invalid/string/string-basic-multiline-control-3.toml
new file mode 100644
index 0000000..45e378f
--- /dev/null
+++ b/tests/data/invalid/toml-lang-compliance/invalid/string/string-basic-multiline-control-3.toml
@@ -0,0 +1 @@
+a = """null"""
diff --git a/tests/data/invalid/toml-lang-compliance/invalid/string/string-basic-multiline-control-4.toml b/tests/data/invalid/toml-lang-compliance/invalid/string/string-basic-multiline-control-4.toml
new file mode 100644
index 0000000..7d788a8
--- /dev/null
+++ b/tests/data/invalid/toml-lang-compliance/invalid/string/string-basic-multiline-control-4.toml
@@ -0,0 +1 @@
+a = """null"""
diff --git a/tests/data/invalid/toml-lang-compliance/invalid/string/string-basic-multiline-invalid-backslash.toml b/tests/data/invalid/toml-lang-compliance/invalid/string/string-basic-multiline-invalid-backslash.toml
new file mode 100644
index 0000000..13570d3
--- /dev/null
+++ b/tests/data/invalid/toml-lang-compliance/invalid/string/string-basic-multiline-invalid-backslash.toml
@@ -0,0 +1,3 @@
+a = """
+ foo \ \n
+ bar"""
diff --git a/tests/data/invalid/toml-lang-compliance/invalid/string/string-basic-multiline-out-of-range-unicode-escape-1.toml b/tests/data/invalid/toml-lang-compliance/invalid/string/string-basic-multiline-out-of-range-unicode-escape-1.toml
new file mode 100644
index 0000000..b27e203
--- /dev/null
+++ b/tests/data/invalid/toml-lang-compliance/invalid/string/string-basic-multiline-out-of-range-unicode-escape-1.toml
@@ -0,0 +1 @@
+a = """\UFFFFFFFF"""
diff --git a/tests/data/invalid/toml-lang-compliance/invalid/string/string-basic-multiline-out-of-range-unicode-escape-2.toml b/tests/data/invalid/toml-lang-compliance/invalid/string/string-basic-multiline-out-of-range-unicode-escape-2.toml
new file mode 100644
index 0000000..17a9361
--- /dev/null
+++ b/tests/data/invalid/toml-lang-compliance/invalid/string/string-basic-multiline-out-of-range-unicode-escape-2.toml
@@ -0,0 +1 @@
+a = """\U00D80000"""
diff --git a/tests/data/invalid/toml-lang-compliance/invalid/string/string-basic-multiline-quotes.toml b/tests/data/invalid/toml-lang-compliance/invalid/string/string-basic-multiline-quotes.toml
new file mode 100644
index 0000000..02ebf13
--- /dev/null
+++ b/tests/data/invalid/toml-lang-compliance/invalid/string/string-basic-multiline-quotes.toml
@@ -0,0 +1 @@
+str5 = """Here are three quotation marks: """."""
diff --git a/tests/data/invalid/toml-lang-compliance/invalid/string/string-basic-multiline-unknown-escape.toml b/tests/data/invalid/toml-lang-compliance/invalid/string/string-basic-multiline-unknown-escape.toml
new file mode 100644
index 0000000..35c5cc5
--- /dev/null
+++ b/tests/data/invalid/toml-lang-compliance/invalid/string/string-basic-multiline-unknown-escape.toml
@@ -0,0 +1 @@
+a = """\@"""
diff --git a/tests/data/invalid/toml-lang-compliance/invalid/string/string-basic-out-of-range-unicode-escape-1.toml b/tests/data/invalid/toml-lang-compliance/invalid/string/string-basic-out-of-range-unicode-escape-1.toml
new file mode 100644
index 0000000..ada1f55
--- /dev/null
+++ b/tests/data/invalid/toml-lang-compliance/invalid/string/string-basic-out-of-range-unicode-escape-1.toml
@@ -0,0 +1 @@
+a = "\UFFFFFFFF"
diff --git a/tests/data/invalid/toml-lang-compliance/invalid/string/string-basic-out-of-range-unicode-escape-2.toml b/tests/data/invalid/toml-lang-compliance/invalid/string/string-basic-out-of-range-unicode-escape-2.toml
new file mode 100644
index 0000000..d4833b3
--- /dev/null
+++ b/tests/data/invalid/toml-lang-compliance/invalid/string/string-basic-out-of-range-unicode-escape-2.toml
@@ -0,0 +1 @@
+a = "\U00D80000"
diff --git a/tests/data/invalid/toml-lang-compliance/invalid/string/string-basic-unknown-escape.toml b/tests/data/invalid/toml-lang-compliance/invalid/string/string-basic-unknown-escape.toml
new file mode 100644
index 0000000..381dd85
--- /dev/null
+++ b/tests/data/invalid/toml-lang-compliance/invalid/string/string-basic-unknown-escape.toml
@@ -0,0 +1 @@
+a = "\@"
diff --git a/tests/data/invalid/toml-lang-compliance/invalid/string/string-literal-control-1.toml b/tests/data/invalid/toml-lang-compliance/invalid/string/string-literal-control-1.toml
new file mode 100644
index 0000000..337fdc4
--- /dev/null
+++ b/tests/data/invalid/toml-lang-compliance/invalid/string/string-literal-control-1.toml
Binary files differ
diff --git a/tests/data/invalid/toml-lang-compliance/invalid/string/string-literal-control-2.toml b/tests/data/invalid/toml-lang-compliance/invalid/string/string-literal-control-2.toml
new file mode 100644
index 0000000..a09c908
--- /dev/null
+++ b/tests/data/invalid/toml-lang-compliance/invalid/string/string-literal-control-2.toml
@@ -0,0 +1 @@
+a = 'null'
diff --git a/tests/data/invalid/toml-lang-compliance/invalid/string/string-literal-control-3.toml b/tests/data/invalid/toml-lang-compliance/invalid/string/string-literal-control-3.toml
new file mode 100644
index 0000000..74697de
--- /dev/null
+++ b/tests/data/invalid/toml-lang-compliance/invalid/string/string-literal-control-3.toml
@@ -0,0 +1 @@
+a = 'null'
diff --git a/tests/data/invalid/toml-lang-compliance/invalid/string/string-literal-control-4.toml b/tests/data/invalid/toml-lang-compliance/invalid/string/string-literal-control-4.toml
new file mode 100644
index 0000000..6c11637
--- /dev/null
+++ b/tests/data/invalid/toml-lang-compliance/invalid/string/string-literal-control-4.toml
@@ -0,0 +1 @@
+a = 'null'
diff --git a/tests/data/invalid/toml-lang-compliance/invalid/string/string-literal-multiline-control-1.toml b/tests/data/invalid/toml-lang-compliance/invalid/string/string-literal-multiline-control-1.toml
new file mode 100644
index 0000000..8510285
--- /dev/null
+++ b/tests/data/invalid/toml-lang-compliance/invalid/string/string-literal-multiline-control-1.toml
Binary files differ
diff --git a/tests/data/invalid/toml-lang-compliance/invalid/string/string-literal-multiline-control-2.toml b/tests/data/invalid/toml-lang-compliance/invalid/string/string-literal-multiline-control-2.toml
new file mode 100644
index 0000000..9c02f11
--- /dev/null
+++ b/tests/data/invalid/toml-lang-compliance/invalid/string/string-literal-multiline-control-2.toml
@@ -0,0 +1 @@
+a = '''null'''
diff --git a/tests/data/invalid/toml-lang-compliance/invalid/string/string-literal-multiline-control-4.toml b/tests/data/invalid/toml-lang-compliance/invalid/string/string-literal-multiline-control-4.toml
new file mode 100644
index 0000000..da40ffc
--- /dev/null
+++ b/tests/data/invalid/toml-lang-compliance/invalid/string/string-literal-multiline-control-4.toml
@@ -0,0 +1 @@
+a = '''null'''
diff --git a/tests/data/invalid/toml-lang-compliance/invalid/string/string-literal-multiline-quotes.toml b/tests/data/invalid/toml-lang-compliance/invalid/string/string-literal-multiline-quotes.toml
new file mode 100644
index 0000000..4b97a2a
--- /dev/null
+++ b/tests/data/invalid/toml-lang-compliance/invalid/string/string-literal-multiline-quotes.toml
@@ -0,0 +1 @@
+apos15 = '''Here are fifteen apostrophes: '''''''''''''''''' # INVALID
diff --git a/tests/data/invalid/toml-lang-compliance/invalid/table/inline-table-immutable-1.toml b/tests/data/invalid/toml-lang-compliance/invalid/table/inline-table-immutable-1.toml
new file mode 100644
index 0000000..7689e14
--- /dev/null
+++ b/tests/data/invalid/toml-lang-compliance/invalid/table/inline-table-immutable-1.toml
@@ -0,0 +1,3 @@
+[product]
+type = { name = "Nail" }
+type.edible = false # INVALID
diff --git a/tests/data/invalid/toml-lang-compliance/invalid/table/inline-table-immutable-2.toml b/tests/data/invalid/toml-lang-compliance/invalid/table/inline-table-immutable-2.toml
new file mode 100644
index 0000000..d6937eb
--- /dev/null
+++ b/tests/data/invalid/toml-lang-compliance/invalid/table/inline-table-immutable-2.toml
@@ -0,0 +1,3 @@
+[product]
+type.name = "Nail"
+type = { edible = false } # INVALID
diff --git a/tests/data/invalid/toml-lang-compliance/invalid/table/inline-table-trailing-comma.toml b/tests/data/invalid/toml-lang-compliance/invalid/table/inline-table-trailing-comma.toml
new file mode 100644
index 0000000..59618e1
--- /dev/null
+++ b/tests/data/invalid/toml-lang-compliance/invalid/table/inline-table-trailing-comma.toml
@@ -0,0 +1 @@
+abc = { abc = 123, }
diff --git a/tests/data/invalid/toml-lang-compliance/invalid/table/table-1.toml b/tests/data/invalid/toml-lang-compliance/invalid/table/table-1.toml
new file mode 100644
index 0000000..0704ba7
--- /dev/null
+++ b/tests/data/invalid/toml-lang-compliance/invalid/table/table-1.toml
@@ -0,0 +1,7 @@
+# DO NOT DO THIS
+
+[fruit]
+apple = "red"
+
+[fruit]
+orange = "orange"
diff --git a/tests/data/invalid/toml-lang-compliance/invalid/table/table-2.toml b/tests/data/invalid/toml-lang-compliance/invalid/table/table-2.toml
new file mode 100644
index 0000000..e58bf8e
--- /dev/null
+++ b/tests/data/invalid/toml-lang-compliance/invalid/table/table-2.toml
@@ -0,0 +1,7 @@
+# DO NOT DO THIS EITHER
+
+[fruit]
+apple = "red"
+
+[fruit.apple]
+texture = "smooth"
diff --git a/tests/data/invalid/toml-lang-compliance/invalid/table/table-3.toml b/tests/data/invalid/toml-lang-compliance/invalid/table/table-3.toml
new file mode 100644
index 0000000..9eac5f6
--- /dev/null
+++ b/tests/data/invalid/toml-lang-compliance/invalid/table/table-3.toml
@@ -0,0 +1,5 @@
+[fruit]
+apple.color = "red"
+apple.taste.sweet = true
+
+[fruit.apple] # INVALID
diff --git a/tests/data/invalid/toml-lang-compliance/invalid/table/table-4.toml b/tests/data/invalid/toml-lang-compliance/invalid/table/table-4.toml
new file mode 100644
index 0000000..43dfb39
--- /dev/null
+++ b/tests/data/invalid/toml-lang-compliance/invalid/table/table-4.toml
@@ -0,0 +1,5 @@
+[fruit]
+apple.color = "red"
+apple.taste.sweet = true
+
+[fruit.apple.taste] # INVALID
diff --git a/tests/data/invalid/toml-lang-compliance/invalid/table/table-invalid-1.toml b/tests/data/invalid/toml-lang-compliance/invalid/table/table-invalid-1.toml
new file mode 100644
index 0000000..7609d79
--- /dev/null
+++ b/tests/data/invalid/toml-lang-compliance/invalid/table/table-invalid-1.toml
@@ -0,0 +1,7 @@
+[fruit.physical] # subtable, but to which parent element should it belong?
+ color = "red"
+ shape = "round"
+
+[[fruit]] # parser must throw an error upon discovering that "fruit" is
+ # an array rather than a table
+ name = "apple"
diff --git a/tests/data/invalid/toml-lang-compliance/invalid/table/table-invalid-2.toml b/tests/data/invalid/toml-lang-compliance/invalid/table/table-invalid-2.toml
new file mode 100644
index 0000000..01d4d13
--- /dev/null
+++ b/tests/data/invalid/toml-lang-compliance/invalid/table/table-invalid-2.toml
@@ -0,0 +1,4 @@
+# INVALID TOML DOC
+fruit = []
+
+[[fruit]] # Not allowed
diff --git a/tests/data/invalid/toml-lang-compliance/invalid/table/table-invalid-3.toml b/tests/data/invalid/toml-lang-compliance/invalid/table/table-invalid-3.toml
new file mode 100644
index 0000000..792cbd1
--- /dev/null
+++ b/tests/data/invalid/toml-lang-compliance/invalid/table/table-invalid-3.toml
@@ -0,0 +1,14 @@
+# INVALID TOML DOC
+[[fruit]]
+ name = "apple"
+
+ [[fruit.variety]]
+ name = "red delicious"
+
+ # INVALID: This table conflicts with the previous array of tables
+ [fruit.variety]
+ name = "granny smith"
+
+ [fruit.physical]
+ color = "red"
+ shape = "round"
diff --git a/tests/data/invalid/toml-lang-compliance/invalid/table/table-invalid-4.toml b/tests/data/invalid/toml-lang-compliance/invalid/table/table-invalid-4.toml
new file mode 100644
index 0000000..3ba51fb
--- /dev/null
+++ b/tests/data/invalid/toml-lang-compliance/invalid/table/table-invalid-4.toml
@@ -0,0 +1,14 @@
+# INVALID TOML DOC
+[[fruit]]
+ name = "apple"
+
+ [[fruit.variety]]
+ name = "red delicious"
+
+ [fruit.physical]
+ color = "red"
+ shape = "round"
+
+ # INVALID: This array of tables conflicts with the previous table
+ [[fruit.physical]]
+ color = "green"
diff --git a/tests/data/invalid/unclosed-multiline-string.toml b/tests/data/invalid/unclosed-multiline-string.toml
new file mode 100644
index 0000000..401adec
--- /dev/null
+++ b/tests/data/invalid/unclosed-multiline-string.toml
@@ -0,0 +1,4 @@
+not-closed= """
+diibaa
+blibae ete
+eteta
diff --git a/tests/data/invalid/unclosed-string.toml b/tests/data/invalid/unclosed-string.toml
new file mode 100644
index 0000000..89f75ac
--- /dev/null
+++ b/tests/data/invalid/unclosed-string.toml
@@ -0,0 +1 @@
+"a-string".must-be = "closed \ No newline at end of file
diff --git a/tests/data/valid/apostrophes-in-literal-string.json b/tests/data/valid/apostrophes-in-literal-string.json
new file mode 100644
index 0000000..fddafe7
--- /dev/null
+++ b/tests/data/valid/apostrophes-in-literal-string.json
@@ -0,0 +1 @@
+{"this-str-has-apostrophes": {"type": "string", "value": "' there's one already\n'' two more\n''"}}
diff --git a/tests/data/valid/apostrophes-in-literal-string.toml b/tests/data/valid/apostrophes-in-literal-string.toml
new file mode 100644
index 0000000..4288d08
--- /dev/null
+++ b/tests/data/valid/apostrophes-in-literal-string.toml
@@ -0,0 +1,3 @@
+this-str-has-apostrophes='''' there's one already
+'' two more
+'''''
diff --git a/tests/data/valid/array/array-subtables.json b/tests/data/valid/array/array-subtables.json
new file mode 100644
index 0000000..69ad37e
--- /dev/null
+++ b/tests/data/valid/array/array-subtables.json
@@ -0,0 +1,11 @@
+{"arr":
+ {"type":"array","value":
+ [
+ {"subtab":
+ {"val": {"type":"integer","value":"1"}
+ }
+ },
+ {"subtab": {"val": {"type":"integer","value":"2"}}}
+ ]
+ }
+}
diff --git a/tests/data/valid/array/array-subtables.toml b/tests/data/valid/array/array-subtables.toml
new file mode 100644
index 0000000..7075307
--- /dev/null
+++ b/tests/data/valid/array/array-subtables.toml
@@ -0,0 +1,7 @@
+[[arr]]
+[arr.subtab]
+val=1
+
+[[arr]]
+[arr.subtab]
+val=2
diff --git a/tests/data/valid/array/open-parent-table.json b/tests/data/valid/array/open-parent-table.json
new file mode 100644
index 0000000..7dba1b6
--- /dev/null
+++ b/tests/data/valid/array/open-parent-table.json
@@ -0,0 +1,6 @@
+{
+ "parent-table": {
+ "arr": {"type":"array","value":[{},{}]},
+ "not-arr": {"type":"integer","value":"1"}
+ }
+}
diff --git a/tests/data/valid/array/open-parent-table.toml b/tests/data/valid/array/open-parent-table.toml
new file mode 100644
index 0000000..8eaad12
--- /dev/null
+++ b/tests/data/valid/array/open-parent-table.toml
@@ -0,0 +1,4 @@
+[[parent-table.arr]]
+[[parent-table.arr]]
+[parent-table]
+not-arr = 1
diff --git a/tests/data/valid/boolean.json b/tests/data/valid/boolean.json
new file mode 100644
index 0000000..2540d25
--- /dev/null
+++ b/tests/data/valid/boolean.json
@@ -0,0 +1,4 @@
+{
+ "a": {"type":"bool","value":"true"},
+ "b": {"type":"bool","value":"false"}
+}
diff --git a/tests/data/valid/boolean.toml b/tests/data/valid/boolean.toml
new file mode 100644
index 0000000..e5aaba3
--- /dev/null
+++ b/tests/data/valid/boolean.toml
@@ -0,0 +1,2 @@
+'a'=true
+"b"=false \ No newline at end of file
diff --git a/tests/data/valid/burntsushi/COPYING b/tests/data/valid/burntsushi/COPYING
new file mode 100644
index 0000000..93b2202
--- /dev/null
+++ b/tests/data/valid/burntsushi/COPYING
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2018 TOML authors
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/tests/data/valid/burntsushi/valid/array/array.json b/tests/data/valid/burntsushi/valid/array/array.json
new file mode 100644
index 0000000..4e9d45b
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/array/array.json
@@ -0,0 +1,68 @@
+{
+ "comments": [
+ {
+ "type": "integer",
+ "value": "1"
+ },
+ {
+ "type": "integer",
+ "value": "2"
+ }
+ ],
+ "dates": [
+ {
+ "type": "datetime",
+ "value": "1987-07-05T17:45:00Z"
+ },
+ {
+ "type": "datetime",
+ "value": "1979-05-27T07:32:00Z"
+ },
+ {
+ "type": "datetime",
+ "value": "2006-06-01T11:00:00Z"
+ }
+ ],
+ "floats": [
+ {
+ "type": "float",
+ "value": "1.1"
+ },
+ {
+ "type": "float",
+ "value": "2.1"
+ },
+ {
+ "type": "float",
+ "value": "3.1"
+ }
+ ],
+ "ints": [
+ {
+ "type": "integer",
+ "value": "1"
+ },
+ {
+ "type": "integer",
+ "value": "2"
+ },
+ {
+ "type": "integer",
+ "value": "3"
+ }
+ ],
+ "strings": [
+ {
+ "type": "string",
+ "value": "a"
+ },
+ {
+ "type": "string",
+ "value": "b"
+ },
+ {
+ "type": "string",
+ "value": "c"
+ }
+ ]
+}
diff --git a/tests/data/valid/burntsushi/valid/array/array.toml b/tests/data/valid/burntsushi/valid/array/array.toml
new file mode 100644
index 0000000..ab88465
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/array/array.toml
@@ -0,0 +1,12 @@
+ints = [1, 2, 3, ]
+floats = [1.1, 2.1, 3.1]
+strings = ["a", "b", "c"]
+dates = [
+ 1987-07-05T17:45:00Z,
+ 1979-05-27T07:32:00Z,
+ 2006-06-01T11:00:00Z,
+]
+comments = [
+ 1,
+ 2, #this is ok
+]
diff --git a/tests/data/valid/burntsushi/valid/array/bool.json b/tests/data/valid/burntsushi/valid/array/bool.json
new file mode 100644
index 0000000..7cede3f
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/array/bool.json
@@ -0,0 +1,12 @@
+{
+ "a": [
+ {
+ "type": "bool",
+ "value": "true"
+ },
+ {
+ "type": "bool",
+ "value": "false"
+ }
+ ]
+}
diff --git a/tests/data/valid/burntsushi/valid/array/bool.toml b/tests/data/valid/burntsushi/valid/array/bool.toml
new file mode 100644
index 0000000..d2010c5
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/array/bool.toml
@@ -0,0 +1 @@
+a = [true, false]
diff --git a/tests/data/valid/burntsushi/valid/array/empty.json b/tests/data/valid/burntsushi/valid/array/empty.json
new file mode 100644
index 0000000..7b1ca0c
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/array/empty.json
@@ -0,0 +1,11 @@
+{
+ "thevoid": [
+ [
+ [
+ [
+ []
+ ]
+ ]
+ ]
+ ]
+}
diff --git a/tests/data/valid/burntsushi/valid/array/empty.toml b/tests/data/valid/burntsushi/valid/array/empty.toml
new file mode 100644
index 0000000..fa58dc6
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/array/empty.toml
@@ -0,0 +1 @@
+thevoid = [[[[[]]]]]
diff --git a/tests/data/valid/burntsushi/valid/array/hetergeneous.json b/tests/data/valid/burntsushi/valid/array/hetergeneous.json
new file mode 100644
index 0000000..751b624
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/array/hetergeneous.json
@@ -0,0 +1,34 @@
+{
+ "mixed": [
+ [
+ {
+ "type": "integer",
+ "value": "1"
+ },
+ {
+ "type": "integer",
+ "value": "2"
+ }
+ ],
+ [
+ {
+ "type": "string",
+ "value": "a"
+ },
+ {
+ "type": "string",
+ "value": "b"
+ }
+ ],
+ [
+ {
+ "type": "float",
+ "value": "1.1"
+ },
+ {
+ "type": "float",
+ "value": "2.1"
+ }
+ ]
+ ]
+}
diff --git a/tests/data/valid/burntsushi/valid/array/hetergeneous.toml b/tests/data/valid/burntsushi/valid/array/hetergeneous.toml
new file mode 100644
index 0000000..a246fcf
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/array/hetergeneous.toml
@@ -0,0 +1 @@
+mixed = [[1, 2], ["a", "b"], [1.1, 2.1]]
diff --git a/tests/data/valid/burntsushi/valid/array/mixed-int-array.json b/tests/data/valid/burntsushi/valid/array/mixed-int-array.json
new file mode 100644
index 0000000..2f3ac5e
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/array/mixed-int-array.json
@@ -0,0 +1,14 @@
+{
+ "arrays-and-ints": [
+ {
+ "type": "integer",
+ "value": "1"
+ },
+ [
+ {
+ "type": "string",
+ "value": "Arrays are not integers."
+ }
+ ]
+ ]
+}
diff --git a/tests/data/valid/burntsushi/valid/array/mixed-int-array.toml b/tests/data/valid/burntsushi/valid/array/mixed-int-array.toml
new file mode 100644
index 0000000..051ec73
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/array/mixed-int-array.toml
@@ -0,0 +1 @@
+arrays-and-ints = [1, ["Arrays are not integers."]]
diff --git a/tests/data/valid/burntsushi/valid/array/mixed-int-float.json b/tests/data/valid/burntsushi/valid/array/mixed-int-float.json
new file mode 100644
index 0000000..e73059b
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/array/mixed-int-float.json
@@ -0,0 +1,12 @@
+{
+ "ints-and-floats": [
+ {
+ "type": "integer",
+ "value": "1"
+ },
+ {
+ "type": "float",
+ "value": "1.1"
+ }
+ ]
+}
diff --git a/tests/data/valid/burntsushi/valid/array/mixed-int-float.toml b/tests/data/valid/burntsushi/valid/array/mixed-int-float.toml
new file mode 100644
index 0000000..a5aa9b7
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/array/mixed-int-float.toml
@@ -0,0 +1 @@
+ints-and-floats = [1, 1.1]
diff --git a/tests/data/valid/burntsushi/valid/array/mixed-int-string.json b/tests/data/valid/burntsushi/valid/array/mixed-int-string.json
new file mode 100644
index 0000000..c6acc76
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/array/mixed-int-string.json
@@ -0,0 +1,12 @@
+{
+ "strings-and-ints": [
+ {
+ "type": "string",
+ "value": "hi"
+ },
+ {
+ "type": "integer",
+ "value": "42"
+ }
+ ]
+}
diff --git a/tests/data/valid/burntsushi/valid/array/mixed-int-string.toml b/tests/data/valid/burntsushi/valid/array/mixed-int-string.toml
new file mode 100644
index 0000000..f348308
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/array/mixed-int-string.toml
@@ -0,0 +1 @@
+strings-and-ints = ["hi", 42]
diff --git a/tests/data/valid/burntsushi/valid/array/mixed-string-table.json b/tests/data/valid/burntsushi/valid/array/mixed-string-table.json
new file mode 100644
index 0000000..6185aa9
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/array/mixed-string-table.json
@@ -0,0 +1,22 @@
+{
+ "contributors": [
+ {
+ "type": "string",
+ "value": "Foo Bar \u003cfoo@example.com\u003e"
+ },
+ {
+ "email": {
+ "type": "string",
+ "value": "bazqux@example.com"
+ },
+ "name": {
+ "type": "string",
+ "value": "Baz Qux"
+ },
+ "url": {
+ "type": "string",
+ "value": "https://example.com/bazqux"
+ }
+ }
+ ]
+}
diff --git a/tests/data/valid/burntsushi/valid/array/mixed-string-table.toml b/tests/data/valid/burntsushi/valid/array/mixed-string-table.toml
new file mode 100644
index 0000000..bd7ada8
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/array/mixed-string-table.toml
@@ -0,0 +1,4 @@
+contributors = [
+ "Foo Bar <foo@example.com>",
+ { name = "Baz Qux", email = "bazqux@example.com", url = "https://example.com/bazqux" }
+]
diff --git a/tests/data/valid/burntsushi/valid/array/nested-double.json b/tests/data/valid/burntsushi/valid/array/nested-double.json
new file mode 100644
index 0000000..c89a8c9
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/array/nested-double.json
@@ -0,0 +1,28 @@
+{
+ "nest": [
+ [
+ [
+ {
+ "type": "string",
+ "value": "a"
+ }
+ ],
+ [
+ {
+ "type": "integer",
+ "value": "1"
+ },
+ {
+ "type": "integer",
+ "value": "2"
+ },
+ [
+ {
+ "type": "integer",
+ "value": "3"
+ }
+ ]
+ ]
+ ]
+ ]
+}
diff --git a/tests/data/valid/burntsushi/valid/array/nested-double.toml b/tests/data/valid/burntsushi/valid/array/nested-double.toml
new file mode 100644
index 0000000..c1de747
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/array/nested-double.toml
@@ -0,0 +1,6 @@
+nest = [
+ [
+ ["a"],
+ [1, 2, [3]]
+ ]
+]
diff --git a/tests/data/valid/burntsushi/valid/array/nested-inline-table.json b/tests/data/valid/burntsushi/valid/array/nested-inline-table.json
new file mode 100644
index 0000000..2ae5fa7
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/array/nested-inline-table.json
@@ -0,0 +1,7 @@
+{
+ "a": [
+ {
+ "b": {}
+ }
+ ]
+}
diff --git a/tests/data/valid/burntsushi/valid/array/nested-inline-table.toml b/tests/data/valid/burntsushi/valid/array/nested-inline-table.toml
new file mode 100644
index 0000000..e1e24f6
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/array/nested-inline-table.toml
@@ -0,0 +1 @@
+a = [ { b = {} } ]
diff --git a/tests/data/valid/burntsushi/valid/array/nested.json b/tests/data/valid/burntsushi/valid/array/nested.json
new file mode 100644
index 0000000..72c7589
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/array/nested.json
@@ -0,0 +1,16 @@
+{
+ "nest": [
+ [
+ {
+ "type": "string",
+ "value": "a"
+ }
+ ],
+ [
+ {
+ "type": "string",
+ "value": "b"
+ }
+ ]
+ ]
+}
diff --git a/tests/data/valid/burntsushi/valid/array/nested.toml b/tests/data/valid/burntsushi/valid/array/nested.toml
new file mode 100644
index 0000000..ce33022
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/array/nested.toml
@@ -0,0 +1 @@
+nest = [["a"], ["b"]]
diff --git a/tests/data/valid/burntsushi/valid/array/nospaces.json b/tests/data/valid/burntsushi/valid/array/nospaces.json
new file mode 100644
index 0000000..6c89fce
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/array/nospaces.json
@@ -0,0 +1,16 @@
+{
+ "ints": [
+ {
+ "type": "integer",
+ "value": "1"
+ },
+ {
+ "type": "integer",
+ "value": "2"
+ },
+ {
+ "type": "integer",
+ "value": "3"
+ }
+ ]
+}
diff --git a/tests/data/valid/burntsushi/valid/array/nospaces.toml b/tests/data/valid/burntsushi/valid/array/nospaces.toml
new file mode 100644
index 0000000..6618936
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/array/nospaces.toml
@@ -0,0 +1 @@
+ints = [1,2,3]
diff --git a/tests/data/valid/burntsushi/valid/array/string-quote-comma-2.json b/tests/data/valid/burntsushi/valid/array/string-quote-comma-2.json
new file mode 100644
index 0000000..7cd5406
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/array/string-quote-comma-2.json
@@ -0,0 +1,8 @@
+{
+ "title": [
+ {
+ "type": "string",
+ "value": " \", "
+ }
+ ]
+}
diff --git a/tests/data/valid/burntsushi/valid/array/string-quote-comma-2.toml b/tests/data/valid/burntsushi/valid/array/string-quote-comma-2.toml
new file mode 100644
index 0000000..4758ddc
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/array/string-quote-comma-2.toml
@@ -0,0 +1 @@
+title = [ " \", ",]
diff --git a/tests/data/valid/burntsushi/valid/array/string-quote-comma.json b/tests/data/valid/burntsushi/valid/array/string-quote-comma.json
new file mode 100644
index 0000000..b78db42
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/array/string-quote-comma.json
@@ -0,0 +1,12 @@
+{
+ "title": [
+ {
+ "type": "string",
+ "value": "Client: \"XXXX\", Job: XXXX"
+ },
+ {
+ "type": "string",
+ "value": "Code: XXXX"
+ }
+ ]
+}
diff --git a/tests/data/valid/burntsushi/valid/array/string-quote-comma.toml b/tests/data/valid/burntsushi/valid/array/string-quote-comma.toml
new file mode 100644
index 0000000..6b458e1
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/array/string-quote-comma.toml
@@ -0,0 +1,4 @@
+title = [
+"Client: \"XXXX\", Job: XXXX",
+"Code: XXXX"
+]
diff --git a/tests/data/valid/burntsushi/valid/array/string-with-comma.json b/tests/data/valid/burntsushi/valid/array/string-with-comma.json
new file mode 100644
index 0000000..42b77ef
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/array/string-with-comma.json
@@ -0,0 +1,12 @@
+{
+ "title": [
+ {
+ "type": "string",
+ "value": "Client: XXXX, Job: XXXX"
+ },
+ {
+ "type": "string",
+ "value": "Code: XXXX"
+ }
+ ]
+}
diff --git a/tests/data/valid/burntsushi/valid/array/string-with-comma.toml b/tests/data/valid/burntsushi/valid/array/string-with-comma.toml
new file mode 100644
index 0000000..655c40e
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/array/string-with-comma.toml
@@ -0,0 +1,4 @@
+title = [
+"Client: XXXX, Job: XXXX",
+"Code: XXXX"
+]
diff --git a/tests/data/valid/burntsushi/valid/array/strings.json b/tests/data/valid/burntsushi/valid/array/strings.json
new file mode 100644
index 0000000..27617b4
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/array/strings.json
@@ -0,0 +1,20 @@
+{
+ "string_array": [
+ {
+ "type": "string",
+ "value": "all"
+ },
+ {
+ "type": "string",
+ "value": "strings"
+ },
+ {
+ "type": "string",
+ "value": "are the same"
+ },
+ {
+ "type": "string",
+ "value": "type"
+ }
+ ]
+}
diff --git a/tests/data/valid/burntsushi/valid/array/strings.toml b/tests/data/valid/burntsushi/valid/array/strings.toml
new file mode 100644
index 0000000..51894ce
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/array/strings.toml
@@ -0,0 +1 @@
+string_array = [ "all", 'strings', """are the same""", '''type''']
diff --git a/tests/data/valid/burntsushi/valid/array/table-array-string-backslash.json b/tests/data/valid/burntsushi/valid/array/table-array-string-backslash.json
new file mode 100644
index 0000000..2c0feb1
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/array/table-array-string-backslash.json
@@ -0,0 +1,10 @@
+{
+ "foo": [
+ {
+ "bar": {
+ "type": "string",
+ "value": "\"{{baz}}\""
+ }
+ }
+ ]
+}
diff --git a/tests/data/valid/burntsushi/valid/array/table-array-string-backslash.toml b/tests/data/valid/burntsushi/valid/array/table-array-string-backslash.toml
new file mode 100644
index 0000000..f0de81e
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/array/table-array-string-backslash.toml
@@ -0,0 +1 @@
+foo = [ { bar="\"{{baz}}\""} ]
diff --git a/tests/data/valid/burntsushi/valid/bool/bool.json b/tests/data/valid/burntsushi/valid/bool/bool.json
new file mode 100644
index 0000000..be47d6d
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/bool/bool.json
@@ -0,0 +1,10 @@
+{
+ "f": {
+ "type": "bool",
+ "value": "false"
+ },
+ "t": {
+ "type": "bool",
+ "value": "true"
+ }
+}
diff --git a/tests/data/valid/burntsushi/valid/bool/bool.toml b/tests/data/valid/burntsushi/valid/bool/bool.toml
new file mode 100644
index 0000000..a8a829b
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/bool/bool.toml
@@ -0,0 +1,2 @@
+t = true
+f = false
diff --git a/tests/data/valid/burntsushi/valid/comment/at-eof.json b/tests/data/valid/burntsushi/valid/comment/at-eof.json
new file mode 100644
index 0000000..af3154a
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/comment/at-eof.json
@@ -0,0 +1,6 @@
+{
+ "key": {
+ "type": "string",
+ "value": "value"
+ }
+}
diff --git a/tests/data/valid/burntsushi/valid/comment/at-eof.toml b/tests/data/valid/burntsushi/valid/comment/at-eof.toml
new file mode 100644
index 0000000..090b474
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/comment/at-eof.toml
@@ -0,0 +1,2 @@
+# This is a full-line comment
+key = "value" # This is a comment at the end of a line
diff --git a/tests/data/valid/burntsushi/valid/comment/at-eof2.json b/tests/data/valid/burntsushi/valid/comment/at-eof2.json
new file mode 100644
index 0000000..af3154a
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/comment/at-eof2.json
@@ -0,0 +1,6 @@
+{
+ "key": {
+ "type": "string",
+ "value": "value"
+ }
+}
diff --git a/tests/data/valid/burntsushi/valid/comment/at-eof2.toml b/tests/data/valid/burntsushi/valid/comment/at-eof2.toml
new file mode 100644
index 0000000..090b474
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/comment/at-eof2.toml
@@ -0,0 +1,2 @@
+# This is a full-line comment
+key = "value" # This is a comment at the end of a line
diff --git a/tests/data/valid/burntsushi/valid/comment/everywhere.json b/tests/data/valid/burntsushi/valid/comment/everywhere.json
new file mode 100644
index 0000000..6e714d1
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/comment/everywhere.json
@@ -0,0 +1,26 @@
+{
+ "group": {
+ "answer": {
+ "type": "integer",
+ "value": "42"
+ },
+ "dt": {
+ "type": "datetime",
+ "value": "1979-05-27T07:32:12-07:00"
+ },
+ "d": {
+ "type": "date-local",
+ "value": "1979-05-27"
+ },
+ "more": [
+ {
+ "type": "integer",
+ "value": "42"
+ },
+ {
+ "type": "integer",
+ "value": "42"
+ }
+ ]
+ }
+}
diff --git a/tests/data/valid/burntsushi/valid/comment/everywhere.toml b/tests/data/valid/burntsushi/valid/comment/everywhere.toml
new file mode 100644
index 0000000..a5da1d7
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/comment/everywhere.toml
@@ -0,0 +1,28 @@
+# Top comment.
+ # Top comment.
+# Top comment.
+
+# [no-extraneous-groups-please]
+
+[group] # Comment
+answer = 42 # Comment
+# no-extraneous-keys-please = 999
+# Inbetween comment.
+more = [ # Comment
+ # What about multiple # comments?
+ # Can you handle it?
+ #
+ # Evil.
+# Evil.
+ 42, 42, # Comments within arrays are fun.
+ # What about multiple # comments?
+ # Can you handle it?
+ #
+ # Evil.
+# Evil.
+# ] Did I fool you?
+] # Hopefully not.
+
+# Make sure the space between the datetime and "#" isn't lexed.
+dt = 1979-05-27T07:32:12-07:00 # c
+d = 1979-05-27 # Comment
diff --git a/tests/data/valid/burntsushi/valid/comment/noeol.json b/tests/data/valid/burntsushi/valid/comment/noeol.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/comment/noeol.json
@@ -0,0 +1 @@
+{}
diff --git a/tests/data/valid/burntsushi/valid/comment/noeol.toml b/tests/data/valid/burntsushi/valid/comment/noeol.toml
new file mode 100644
index 0000000..7662df8
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/comment/noeol.toml
@@ -0,0 +1 @@
+# single comment without any eol characters \ No newline at end of file
diff --git a/tests/data/valid/burntsushi/valid/comment/tricky.json b/tests/data/valid/burntsushi/valid/comment/tricky.json
new file mode 100644
index 0000000..0994864
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/comment/tricky.json
@@ -0,0 +1,98 @@
+{
+ "hash#tag": {
+ "#!": {
+ "type": "string",
+ "value": "hash bang"
+ },
+ "arr3": [
+ {
+ "type": "string",
+ "value": "#"
+ },
+ {
+ "type": "string",
+ "value": "#"
+ },
+ {
+ "type": "string",
+ "value": "###"
+ }
+ ],
+ "arr4": [
+ {
+ "type": "integer",
+ "value": "1"
+ },
+ {
+ "type": "integer",
+ "value": "2"
+ },
+ {
+ "type": "integer",
+ "value": "3"
+ },
+ {
+ "type": "integer",
+ "value": "4"
+ }
+ ],
+ "arr5": [
+ [
+ [
+ [
+ [
+ {
+ "type": "string",
+ "value": "#"
+ }
+ ]
+ ]
+ ]
+ ]
+ ],
+ "tbl1": {
+ "#": {
+ "type": "string",
+ "value": "}#"
+ }
+ }
+ },
+ "section": {
+ "8": {
+ "type": "string",
+ "value": "eight"
+ },
+ "eleven": {
+ "type": "float",
+ "value": "11.1"
+ },
+ "five": {
+ "type": "float",
+ "value": "5.5"
+ },
+ "four": {
+ "type": "string",
+ "value": "# no comment\n# nor this\n#also not comment"
+ },
+ "one": {
+ "type": "string",
+ "value": "11"
+ },
+ "six": {
+ "type": "integer",
+ "value": "6"
+ },
+ "ten": {
+ "type": "float",
+ "value": "1000.0"
+ },
+ "three": {
+ "type": "string",
+ "value": "#"
+ },
+ "two": {
+ "type": "string",
+ "value": "22#"
+ }
+ }
+}
diff --git a/tests/data/valid/burntsushi/valid/comment/tricky.toml b/tests/data/valid/burntsushi/valid/comment/tricky.toml
new file mode 100644
index 0000000..c95f94d
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/comment/tricky.toml
@@ -0,0 +1,31 @@
+[section]#attached comment
+#[notsection]
+one = "11"#cmt
+two = "22#"
+three = '#'
+
+four = """# no comment
+# nor this
+#also not comment"""#is_comment
+
+five = 5.5#66
+six = 6#7
+8 = "eight"
+#nine = 99
+ten = 10e2#1
+eleven = 1.11e1#23
+
+["hash#tag"]
+"#!" = "hash bang"
+arr3 = [ "#", '#', """###""" ]
+arr4 = [ 1,# 9, 9,
+2#,9
+,#9
+3#]
+,4]
+arr5 = [[[[#["#"],
+["#"]]]]#]
+]
+tbl1 = { "#" = '}#'}#}}
+
+
diff --git a/tests/data/valid/burntsushi/valid/datetime/datetime.json b/tests/data/valid/burntsushi/valid/datetime/datetime.json
new file mode 100644
index 0000000..5146335
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/datetime/datetime.json
@@ -0,0 +1,10 @@
+{
+ "lower": {
+ "type": "datetime",
+ "value": "1987-07-05T17:45:00Z"
+ },
+ "space": {
+ "type": "datetime",
+ "value": "1987-07-05T17:45:00Z"
+ }
+}
diff --git a/tests/data/valid/burntsushi/valid/datetime/datetime.toml b/tests/data/valid/burntsushi/valid/datetime/datetime.toml
new file mode 100644
index 0000000..653d521
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/datetime/datetime.toml
@@ -0,0 +1,2 @@
+space = 1987-07-05 17:45:00Z
+lower = 1987-07-05t17:45:00z
diff --git a/tests/data/valid/burntsushi/valid/datetime/local-date.json b/tests/data/valid/burntsushi/valid/datetime/local-date.json
new file mode 100644
index 0000000..8fea2fe
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/datetime/local-date.json
@@ -0,0 +1,6 @@
+{
+ "bestdayever": {
+ "type": "date-local",
+ "value": "1987-07-05"
+ }
+}
diff --git a/tests/data/valid/burntsushi/valid/datetime/local-date.toml b/tests/data/valid/burntsushi/valid/datetime/local-date.toml
new file mode 100644
index 0000000..1be4a5f
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/datetime/local-date.toml
@@ -0,0 +1 @@
+bestdayever = 1987-07-05
diff --git a/tests/data/valid/burntsushi/valid/datetime/local-time.json b/tests/data/valid/burntsushi/valid/datetime/local-time.json
new file mode 100644
index 0000000..5e527e9
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/datetime/local-time.json
@@ -0,0 +1,10 @@
+{
+ "besttimeever": {
+ "type": "time-local",
+ "value": "17:45:00"
+ },
+ "milliseconds": {
+ "type": "time-local",
+ "value": "10:32:00.555"
+ }
+}
diff --git a/tests/data/valid/burntsushi/valid/datetime/local-time.toml b/tests/data/valid/burntsushi/valid/datetime/local-time.toml
new file mode 100644
index 0000000..6b07f6f
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/datetime/local-time.toml
@@ -0,0 +1,2 @@
+besttimeever = 17:45:00
+milliseconds = 10:32:00.555
diff --git a/tests/data/valid/burntsushi/valid/datetime/local.json b/tests/data/valid/burntsushi/valid/datetime/local.json
new file mode 100644
index 0000000..12f8df5
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/datetime/local.json
@@ -0,0 +1,14 @@
+{
+ "local": {
+ "type": "datetime-local",
+ "value": "1987-07-05T17:45:00"
+ },
+ "milli": {
+ "type": "datetime-local",
+ "value": "1977-12-21T10:32:00.555"
+ },
+ "space": {
+ "type": "datetime-local",
+ "value": "1987-07-05T17:45:00"
+ }
+}
diff --git a/tests/data/valid/burntsushi/valid/datetime/local.toml b/tests/data/valid/burntsushi/valid/datetime/local.toml
new file mode 100644
index 0000000..ab425ec
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/datetime/local.toml
@@ -0,0 +1,3 @@
+local = 1987-07-05T17:45:00
+milli = 1977-12-21T10:32:00.555
+space = 1987-07-05 17:45:00
diff --git a/tests/data/valid/burntsushi/valid/datetime/milliseconds.json b/tests/data/valid/burntsushi/valid/datetime/milliseconds.json
new file mode 100644
index 0000000..c49e400
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/datetime/milliseconds.json
@@ -0,0 +1,18 @@
+{
+ "utc1": {
+ "type": "datetime",
+ "value": "1987-07-05T17:45:56.1234Z"
+ },
+ "utc2": {
+ "type": "datetime",
+ "value": "1987-07-05T17:45:56.6000Z"
+ },
+ "wita1": {
+ "type": "datetime",
+ "value": "1987-07-05T17:45:56.1234+08:00"
+ },
+ "wita2": {
+ "type": "datetime",
+ "value": "1987-07-05T17:45:56.6000+08:00"
+ }
+}
diff --git a/tests/data/valid/burntsushi/valid/datetime/milliseconds.toml b/tests/data/valid/burntsushi/valid/datetime/milliseconds.toml
new file mode 100644
index 0000000..24b81f8
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/datetime/milliseconds.toml
@@ -0,0 +1,4 @@
+utc1 = 1987-07-05T17:45:56.1234Z
+utc2 = 1987-07-05T17:45:56.6Z
+wita1 = 1987-07-05T17:45:56.1234+08:00
+wita2 = 1987-07-05T17:45:56.6+08:00
diff --git a/tests/data/valid/burntsushi/valid/datetime/timezone.json b/tests/data/valid/burntsushi/valid/datetime/timezone.json
new file mode 100644
index 0000000..8dc8328
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/datetime/timezone.json
@@ -0,0 +1,18 @@
+{
+ "nzdt": {
+ "type": "datetime",
+ "value": "1987-07-05T17:45:56+13:00"
+ },
+ "nzst": {
+ "type": "datetime",
+ "value": "1987-07-05T17:45:56+12:00"
+ },
+ "pdt": {
+ "type": "datetime",
+ "value": "1987-07-05T17:45:56-05:00"
+ },
+ "utc": {
+ "type": "datetime",
+ "value": "1987-07-05T17:45:56Z"
+ }
+}
diff --git a/tests/data/valid/burntsushi/valid/datetime/timezone.toml b/tests/data/valid/burntsushi/valid/datetime/timezone.toml
new file mode 100644
index 0000000..20f3835
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/datetime/timezone.toml
@@ -0,0 +1,4 @@
+utc = 1987-07-05T17:45:56Z
+pdt = 1987-07-05T17:45:56-05:00
+nzst = 1987-07-05T17:45:56+12:00
+nzdt = 1987-07-05T17:45:56+13:00 # DST
diff --git a/tests/data/valid/burntsushi/valid/empty-file.json b/tests/data/valid/burntsushi/valid/empty-file.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/empty-file.json
@@ -0,0 +1 @@
+{}
diff --git a/tests/data/valid/burntsushi/valid/empty-file.toml b/tests/data/valid/burntsushi/valid/empty-file.toml
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/empty-file.toml
diff --git a/tests/data/valid/burntsushi/valid/example.json b/tests/data/valid/burntsushi/valid/example.json
new file mode 100644
index 0000000..2ea95a2
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/example.json
@@ -0,0 +1,26 @@
+{
+ "best-day-ever": {
+ "type": "datetime",
+ "value": "1987-07-05T17:45:00Z"
+ },
+ "numtheory": {
+ "boring": {
+ "type": "bool",
+ "value": "false"
+ },
+ "perfection": [
+ {
+ "type": "integer",
+ "value": "6"
+ },
+ {
+ "type": "integer",
+ "value": "28"
+ },
+ {
+ "type": "integer",
+ "value": "496"
+ }
+ ]
+ }
+}
diff --git a/tests/data/valid/burntsushi/valid/example.toml b/tests/data/valid/burntsushi/valid/example.toml
new file mode 100644
index 0000000..8cb02e0
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/example.toml
@@ -0,0 +1,5 @@
+best-day-ever = 1987-07-05T17:45:00Z
+
+[numtheory]
+boring = false
+perfection = [6, 28, 496]
diff --git a/tests/data/valid/burntsushi/valid/float/exponent.json b/tests/data/valid/burntsushi/valid/float/exponent.json
new file mode 100644
index 0000000..e79a6e1
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/float/exponent.json
@@ -0,0 +1,34 @@
+{
+ "lower": {
+ "type": "float",
+ "value": "300.0"
+ },
+ "minustenth": {
+ "type": "float",
+ "value": "-0.1"
+ },
+ "neg": {
+ "type": "float",
+ "value": "0.03"
+ },
+ "pointlower": {
+ "type": "float",
+ "value": "310.0"
+ },
+ "pointupper": {
+ "type": "float",
+ "value": "310.0"
+ },
+ "pos": {
+ "type": "float",
+ "value": "300.0"
+ },
+ "upper": {
+ "type": "float",
+ "value": "300.0"
+ },
+ "zero": {
+ "type": "float",
+ "value": "3.0"
+ }
+}
diff --git a/tests/data/valid/burntsushi/valid/float/exponent.toml b/tests/data/valid/burntsushi/valid/float/exponent.toml
new file mode 100644
index 0000000..573e0a8
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/float/exponent.toml
@@ -0,0 +1,8 @@
+lower = 3e2
+upper = 3E2
+neg = 3e-2
+pos = 3E+2
+zero = 3e0
+pointlower = 3.1e2
+pointupper = 3.1E2
+minustenth = -1E-1
diff --git a/tests/data/valid/burntsushi/valid/float/float.json b/tests/data/valid/burntsushi/valid/float/float.json
new file mode 100644
index 0000000..f92d8d8
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/float/float.json
@@ -0,0 +1,18 @@
+{
+ "negpi": {
+ "type": "float",
+ "value": "-3.14"
+ },
+ "pi": {
+ "type": "float",
+ "value": "3.14"
+ },
+ "pospi": {
+ "type": "float",
+ "value": "3.14"
+ },
+ "zero-intpart": {
+ "type": "float",
+ "value": "0.123"
+ }
+}
diff --git a/tests/data/valid/burntsushi/valid/float/float.toml b/tests/data/valid/burntsushi/valid/float/float.toml
new file mode 100644
index 0000000..5f02322
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/float/float.toml
@@ -0,0 +1,4 @@
+pi = 3.14
+pospi = +3.14
+negpi = -3.14
+zero-intpart = 0.123
diff --git a/tests/data/valid/burntsushi/valid/float/inf-and-nan.json b/tests/data/valid/burntsushi/valid/float/inf-and-nan.json
new file mode 100644
index 0000000..e3f1ba3
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/float/inf-and-nan.json
@@ -0,0 +1,26 @@
+{
+ "infinity": {
+ "type": "float",
+ "value": "inf"
+ },
+ "infinity_neg": {
+ "type": "float",
+ "value": "-inf"
+ },
+ "infinity_plus": {
+ "type": "float",
+ "value": "+inf"
+ },
+ "nan": {
+ "type": "float",
+ "value": "nan"
+ },
+ "nan_neg": {
+ "type": "float",
+ "value": "nan"
+ },
+ "nan_plus": {
+ "type": "float",
+ "value": "nan"
+ }
+}
diff --git a/tests/data/valid/burntsushi/valid/float/inf-and-nan.toml b/tests/data/valid/burntsushi/valid/float/inf-and-nan.toml
new file mode 100644
index 0000000..c8f8459
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/float/inf-and-nan.toml
@@ -0,0 +1,8 @@
+# We don't encode +nan and -nan back with the signs; many languages don't
+# support a sign on NaN (it doesn't really make much sense).
+nan = nan
+nan_neg = -nan
+nan_plus = +nan
+infinity = inf
+infinity_neg = -inf
+infinity_plus = +inf
diff --git a/tests/data/valid/burntsushi/valid/float/long.json b/tests/data/valid/burntsushi/valid/float/long.json
new file mode 100644
index 0000000..73d7505
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/float/long.json
@@ -0,0 +1,10 @@
+{
+ "longpi": {
+ "type": "float",
+ "value": "3.141592653589793"
+ },
+ "neglongpi": {
+ "type": "float",
+ "value": "-3.141592653589793"
+ }
+}
diff --git a/tests/data/valid/burntsushi/valid/float/long.toml b/tests/data/valid/burntsushi/valid/float/long.toml
new file mode 100644
index 0000000..9558ae4
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/float/long.toml
@@ -0,0 +1,2 @@
+longpi = 3.141592653589793
+neglongpi = -3.141592653589793
diff --git a/tests/data/valid/burntsushi/valid/float/underscore.json b/tests/data/valid/burntsushi/valid/float/underscore.json
new file mode 100644
index 0000000..f54f7b5
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/float/underscore.json
@@ -0,0 +1,14 @@
+{
+ "after": {
+ "type": "float",
+ "value": "3141.5927"
+ },
+ "before": {
+ "type": "float",
+ "value": "3141.5927"
+ },
+ "exponent": {
+ "type": "float",
+ "value": "3.0e14"
+ }
+}
diff --git a/tests/data/valid/burntsushi/valid/float/underscore.toml b/tests/data/valid/burntsushi/valid/float/underscore.toml
new file mode 100644
index 0000000..343353a
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/float/underscore.toml
@@ -0,0 +1,3 @@
+before = 3_141.5927
+after = 3141.592_7
+exponent = 3e1_4
diff --git a/tests/data/valid/burntsushi/valid/float/zero.json b/tests/data/valid/burntsushi/valid/float/zero.json
new file mode 100644
index 0000000..61551e8
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/float/zero.json
@@ -0,0 +1,30 @@
+{
+ "zero": {
+ "type": "float",
+ "value": "0"
+ },
+ "signed-pos": {
+ "type": "float",
+ "value": "0"
+ },
+ "signed-neg": {
+ "type": "float",
+ "value": "0"
+ },
+ "exponent": {
+ "type": "float",
+ "value": "0"
+ },
+ "exponent-two-0": {
+ "type": "float",
+ "value": "0"
+ },
+ "exponent-signed-pos": {
+ "type": "float",
+ "value": "0"
+ },
+ "exponent-signed-neg": {
+ "type": "float",
+ "value": "0"
+ }
+}
diff --git a/tests/data/valid/burntsushi/valid/float/zero.toml b/tests/data/valid/burntsushi/valid/float/zero.toml
new file mode 100644
index 0000000..e7efb1f
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/float/zero.toml
@@ -0,0 +1,7 @@
+zero = 0.0
+signed-pos = +0.0
+signed-neg = -0.0
+exponent = 0e0
+exponent-two-0 = 0e00
+exponent-signed-pos = +0e0
+exponent-signed-neg = -0e0
diff --git a/tests/data/valid/burntsushi/valid/implicit-and-explicit-after.json b/tests/data/valid/burntsushi/valid/implicit-and-explicit-after.json
new file mode 100644
index 0000000..663a34e
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/implicit-and-explicit-after.json
@@ -0,0 +1,16 @@
+{
+ "a": {
+ "b": {
+ "c": {
+ "answer": {
+ "type": "integer",
+ "value": "42"
+ }
+ }
+ },
+ "better": {
+ "type": "integer",
+ "value": "43"
+ }
+ }
+}
diff --git a/tests/data/valid/burntsushi/valid/implicit-and-explicit-after.toml b/tests/data/valid/burntsushi/valid/implicit-and-explicit-after.toml
new file mode 100644
index 0000000..c0e8865
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/implicit-and-explicit-after.toml
@@ -0,0 +1,5 @@
+[a.b.c]
+answer = 42
+
+[a]
+better = 43
diff --git a/tests/data/valid/burntsushi/valid/implicit-and-explicit-before.json b/tests/data/valid/burntsushi/valid/implicit-and-explicit-before.json
new file mode 100644
index 0000000..663a34e
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/implicit-and-explicit-before.json
@@ -0,0 +1,16 @@
+{
+ "a": {
+ "b": {
+ "c": {
+ "answer": {
+ "type": "integer",
+ "value": "42"
+ }
+ }
+ },
+ "better": {
+ "type": "integer",
+ "value": "43"
+ }
+ }
+}
diff --git a/tests/data/valid/burntsushi/valid/implicit-and-explicit-before.toml b/tests/data/valid/burntsushi/valid/implicit-and-explicit-before.toml
new file mode 100644
index 0000000..eee68ff
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/implicit-and-explicit-before.toml
@@ -0,0 +1,5 @@
+[a]
+better = 43
+
+[a.b.c]
+answer = 42
diff --git a/tests/data/valid/burntsushi/valid/implicit-groups.json b/tests/data/valid/burntsushi/valid/implicit-groups.json
new file mode 100644
index 0000000..347c693
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/implicit-groups.json
@@ -0,0 +1,12 @@
+{
+ "a": {
+ "b": {
+ "c": {
+ "answer": {
+ "type": "integer",
+ "value": "42"
+ }
+ }
+ }
+ }
+}
diff --git a/tests/data/valid/burntsushi/valid/implicit-groups.toml b/tests/data/valid/burntsushi/valid/implicit-groups.toml
new file mode 100644
index 0000000..b6333e4
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/implicit-groups.toml
@@ -0,0 +1,2 @@
+[a.b.c]
+answer = 42
diff --git a/tests/data/valid/burntsushi/valid/inline-table/array.json b/tests/data/valid/burntsushi/valid/inline-table/array.json
new file mode 100644
index 0000000..fe78bf6
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/inline-table/array.json
@@ -0,0 +1,34 @@
+{
+ "people": [
+ {
+ "first_name": {
+ "type": "string",
+ "value": "Bruce"
+ },
+ "last_name": {
+ "type": "string",
+ "value": "Springsteen"
+ }
+ },
+ {
+ "first_name": {
+ "type": "string",
+ "value": "Eric"
+ },
+ "last_name": {
+ "type": "string",
+ "value": "Clapton"
+ }
+ },
+ {
+ "first_name": {
+ "type": "string",
+ "value": "Bob"
+ },
+ "last_name": {
+ "type": "string",
+ "value": "Seger"
+ }
+ }
+ ]
+}
diff --git a/tests/data/valid/burntsushi/valid/inline-table/array.toml b/tests/data/valid/burntsushi/valid/inline-table/array.toml
new file mode 100644
index 0000000..3fa60d6
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/inline-table/array.toml
@@ -0,0 +1,3 @@
+people = [{first_name = "Bruce", last_name = "Springsteen"},
+ {first_name = "Eric", last_name = "Clapton"},
+ {first_name = "Bob", last_name = "Seger"}]
diff --git a/tests/data/valid/burntsushi/valid/inline-table/bool.json b/tests/data/valid/burntsushi/valid/inline-table/bool.json
new file mode 100644
index 0000000..717952f
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/inline-table/bool.json
@@ -0,0 +1,12 @@
+{
+ "a": {
+ "a": {
+ "type": "bool",
+ "value": "true"
+ },
+ "b": {
+ "type": "bool",
+ "value": "false"
+ }
+ }
+}
diff --git a/tests/data/valid/burntsushi/valid/inline-table/bool.toml b/tests/data/valid/burntsushi/valid/inline-table/bool.toml
new file mode 100644
index 0000000..d228fc2
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/inline-table/bool.toml
@@ -0,0 +1 @@
+a = {a = true, b = false}
diff --git a/tests/data/valid/burntsushi/valid/inline-table/empty.json b/tests/data/valid/burntsushi/valid/inline-table/empty.json
new file mode 100644
index 0000000..28beacf
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/inline-table/empty.json
@@ -0,0 +1,30 @@
+{
+ "empty1": {},
+ "empty2": {},
+ "empty_in_array": [
+ {
+ "not_empty": {
+ "type": "integer",
+ "value": "1"
+ }
+ },
+ {}
+ ],
+ "empty_in_array2": [
+ {},
+ {
+ "not_empty": {
+ "type": "integer",
+ "value": "1"
+ }
+ }
+ ],
+ "many_empty": [
+ {},
+ {},
+ {}
+ ],
+ "nested_empty": {
+ "empty": {}
+ }
+}
diff --git a/tests/data/valid/burntsushi/valid/inline-table/empty.toml b/tests/data/valid/burntsushi/valid/inline-table/empty.toml
new file mode 100644
index 0000000..910d458
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/inline-table/empty.toml
@@ -0,0 +1,6 @@
+empty1 = {}
+empty2 = { }
+empty_in_array = [ { not_empty = 1 }, {} ]
+empty_in_array2 = [{},{not_empty=1}]
+many_empty = [{},{},{}]
+nested_empty = {"empty"={}}
diff --git a/tests/data/valid/burntsushi/valid/inline-table/end-in-bool.json b/tests/data/valid/burntsushi/valid/inline-table/end-in-bool.json
new file mode 100644
index 0000000..90e700a
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/inline-table/end-in-bool.json
@@ -0,0 +1,16 @@
+{
+ "black": {
+ "allow_prereleases": {
+ "type": "bool",
+ "value": "true"
+ },
+ "python": {
+ "type": "string",
+ "value": "\u003e3.6"
+ },
+ "version": {
+ "type": "string",
+ "value": "\u003e=18.9b0"
+ }
+ }
+}
diff --git a/tests/data/valid/burntsushi/valid/inline-table/end-in-bool.toml b/tests/data/valid/burntsushi/valid/inline-table/end-in-bool.toml
new file mode 100644
index 0000000..94e5651
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/inline-table/end-in-bool.toml
@@ -0,0 +1 @@
+black = { python=">3.6", version=">=18.9b0", allow_prereleases=true }
diff --git a/tests/data/valid/burntsushi/valid/inline-table/inline-table.json b/tests/data/valid/burntsushi/valid/inline-table/inline-table.json
new file mode 100644
index 0000000..2468f62
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/inline-table/inline-table.json
@@ -0,0 +1,48 @@
+{
+ "name": {
+ "first": {
+ "type": "string",
+ "value": "Tom"
+ },
+ "last": {
+ "type": "string",
+ "value": "Preston-Werner"
+ }
+ },
+ "point": {
+ "x": {
+ "type": "integer",
+ "value": "1"
+ },
+ "y": {
+ "type": "integer",
+ "value": "2"
+ }
+ },
+ "simple": {
+ "a": {
+ "type": "integer",
+ "value": "1"
+ }
+ },
+ "str-key": {
+ "a": {
+ "type": "integer",
+ "value": "1"
+ }
+ },
+ "table-array": [
+ {
+ "a": {
+ "type": "integer",
+ "value": "1"
+ }
+ },
+ {
+ "b": {
+ "type": "integer",
+ "value": "2"
+ }
+ }
+ ]
+}
diff --git a/tests/data/valid/burntsushi/valid/inline-table/inline-table.toml b/tests/data/valid/burntsushi/valid/inline-table/inline-table.toml
new file mode 100644
index 0000000..257047e
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/inline-table/inline-table.toml
@@ -0,0 +1,5 @@
+name = { first = "Tom", last = "Preston-Werner" }
+point = { x = 1, y = 2 }
+simple = { a = 1 }
+str-key = { "a" = 1 }
+table-array = [{ "a" = 1 }, { "b" = 2 }]
diff --git a/tests/data/valid/burntsushi/valid/inline-table/key-dotted.json b/tests/data/valid/burntsushi/valid/inline-table/key-dotted.json
new file mode 100644
index 0000000..3886803
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/inline-table/key-dotted.json
@@ -0,0 +1,140 @@
+{
+ "a": {
+ "a": {
+ "b": {
+ "type": "integer",
+ "value": "1"
+ }
+ }
+ },
+ "arr": [
+ {
+ "T": {
+ "a": {
+ "b": {
+ "type": "integer",
+ "value": "1"
+ }
+ }
+ },
+ "t": {
+ "a": {
+ "b": {
+ "type": "integer",
+ "value": "1"
+ }
+ }
+ }
+ },
+ {
+ "T": {
+ "a": {
+ "b": {
+ "type": "integer",
+ "value": "2"
+ }
+ }
+ },
+ "t": {
+ "a": {
+ "b": {
+ "type": "integer",
+ "value": "2"
+ }
+ }
+ }
+ }
+ ],
+ "b": {
+ "a": {
+ "b": {
+ "type": "integer",
+ "value": "1"
+ }
+ }
+ },
+ "c": {
+ "a": {
+ "b": {
+ "type": "integer",
+ "value": "1"
+ }
+ }
+ },
+ "d": {
+ "a": {
+ "b": {
+ "type": "integer",
+ "value": "1"
+ }
+ }
+ },
+ "e": {
+ "a": {
+ "b": {
+ "type": "integer",
+ "value": "1"
+ }
+ }
+ },
+ "inline": {
+ "a": {
+ "b": {
+ "type": "integer",
+ "value": "42"
+ }
+ }
+ },
+ "many": {
+ "dots": {
+ "here": {
+ "dot": {
+ "dot": {
+ "dot": {
+ "a": {
+ "b": {
+ "c": {
+ "type": "integer",
+ "value": "1"
+ },
+ "d": {
+ "type": "integer",
+ "value": "2"
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "tbl": {
+ "a": {
+ "b": {
+ "c": {
+ "d": {
+ "e": {
+ "type": "integer",
+ "value": "1"
+ }
+ }
+ }
+ }
+ },
+ "x": {
+ "a": {
+ "b": {
+ "c": {
+ "d": {
+ "e": {
+ "type": "integer",
+ "value": "1"
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/tests/data/valid/burntsushi/valid/inline-table/key-dotted.toml b/tests/data/valid/burntsushi/valid/inline-table/key-dotted.toml
new file mode 100644
index 0000000..e812943
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/inline-table/key-dotted.toml
@@ -0,0 +1,23 @@
+inline = {a.b = 42}
+
+many.dots.here.dot.dot.dot = {a.b.c = 1, a.b.d = 2}
+
+a = { a.b = 1 }
+b = { "a"."b" = 1 }
+c = { a . b = 1 }
+d = { 'a' . "b" = 1 }
+e = {a.b=1}
+
+[tbl]
+a.b.c = {d.e=1}
+
+[tbl.x]
+a.b.c = {d.e=1}
+
+[[arr]]
+t = {a.b=1}
+T = {a.b=1}
+
+[[arr]]
+t = {a.b=2}
+T = {a.b=2}
diff --git a/tests/data/valid/burntsushi/valid/inline-table/multiline.json b/tests/data/valid/burntsushi/valid/inline-table/multiline.json
new file mode 100644
index 0000000..f946d81
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/inline-table/multiline.json
@@ -0,0 +1,20 @@
+{
+ "tbl_multiline": {
+ "a": {
+ "type": "integer",
+ "value": "1"
+ },
+ "b": {
+ "type": "string",
+ "value": "multiline\n"
+ },
+ "c": {
+ "type": "string",
+ "value": "and yet\nanother line"
+ },
+ "d": {
+ "type": "integer",
+ "value": "4"
+ }
+ }
+}
diff --git a/tests/data/valid/burntsushi/valid/inline-table/multiline.toml b/tests/data/valid/burntsushi/valid/inline-table/multiline.toml
new file mode 100644
index 0000000..a653b18
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/inline-table/multiline.toml
@@ -0,0 +1,4 @@
+tbl_multiline = { a = 1, b = """
+multiline
+""", c = """and yet
+another line""", d = 4 }
diff --git a/tests/data/valid/burntsushi/valid/inline-table/nest.json b/tests/data/valid/burntsushi/valid/inline-table/nest.json
new file mode 100644
index 0000000..70aebb3
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/inline-table/nest.json
@@ -0,0 +1,64 @@
+{
+ "arr_arr_tbl_empty": [
+ [
+ {}
+ ]
+ ],
+ "arr_arr_tbl_val": [
+ [
+ {
+ "one": {
+ "type": "integer",
+ "value": "1"
+ }
+ }
+ ]
+ ],
+ "arr_arr_tbls": [
+ [
+ {
+ "one": {
+ "type": "integer",
+ "value": "1"
+ }
+ },
+ {
+ "two": {
+ "type": "integer",
+ "value": "2"
+ }
+ }
+ ]
+ ],
+ "arr_tbl_tbl": [
+ {
+ "tbl": {
+ "one": {
+ "type": "integer",
+ "value": "1"
+ }
+ }
+ }
+ ],
+ "tbl_arr_tbl": {
+ "arr_tbl": [
+ {
+ "one": {
+ "type": "integer",
+ "value": "1"
+ }
+ }
+ ]
+ },
+ "tbl_tbl_empty": {
+ "tbl_0": {}
+ },
+ "tbl_tbl_val": {
+ "tbl_1": {
+ "one": {
+ "type": "integer",
+ "value": "1"
+ }
+ }
+ }
+}
diff --git a/tests/data/valid/burntsushi/valid/inline-table/nest.toml b/tests/data/valid/burntsushi/valid/inline-table/nest.toml
new file mode 100644
index 0000000..2624c1d
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/inline-table/nest.toml
@@ -0,0 +1,10 @@
+tbl_tbl_empty = { tbl_0 = {} }
+tbl_tbl_val = { tbl_1 = { one = 1 } }
+tbl_arr_tbl = { arr_tbl = [ { one = 1 } ] }
+arr_tbl_tbl = [ { tbl = { one = 1 } } ]
+
+# Array-of-array-of-table is interesting because it can only
+# be represented in inline form.
+arr_arr_tbl_empty = [ [ {} ] ]
+arr_arr_tbl_val = [ [ { one = 1 } ] ]
+arr_arr_tbls = [ [ { one = 1 }, { two = 2 } ] ]
diff --git a/tests/data/valid/burntsushi/valid/integer/integer.json b/tests/data/valid/burntsushi/valid/integer/integer.json
new file mode 100644
index 0000000..eee9758
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/integer/integer.json
@@ -0,0 +1,18 @@
+{
+ "answer": {
+ "type": "integer",
+ "value": "42"
+ },
+ "neganswer": {
+ "type": "integer",
+ "value": "-42"
+ },
+ "posanswer": {
+ "type": "integer",
+ "value": "42"
+ },
+ "zero": {
+ "type": "integer",
+ "value": "0"
+ }
+}
diff --git a/tests/data/valid/burntsushi/valid/integer/integer.toml b/tests/data/valid/burntsushi/valid/integer/integer.toml
new file mode 100644
index 0000000..b62de30
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/integer/integer.toml
@@ -0,0 +1,4 @@
+answer = 42
+posanswer = +42
+neganswer = -42
+zero = 0
diff --git a/tests/data/valid/burntsushi/valid/integer/literals.json b/tests/data/valid/burntsushi/valid/integer/literals.json
new file mode 100644
index 0000000..1a8555b
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/integer/literals.json
@@ -0,0 +1,38 @@
+{
+ "bin1": {
+ "type": "integer",
+ "value": "214"
+ },
+ "bin2": {
+ "type": "integer",
+ "value": "5"
+ },
+ "hex1": {
+ "type": "integer",
+ "value": "3735928559"
+ },
+ "hex2": {
+ "type": "integer",
+ "value": "3735928559"
+ },
+ "hex3": {
+ "type": "integer",
+ "value": "3735928559"
+ },
+ "hex4": {
+ "type": "integer",
+ "value": "2439"
+ },
+ "oct1": {
+ "type": "integer",
+ "value": "342391"
+ },
+ "oct2": {
+ "type": "integer",
+ "value": "493"
+ },
+ "oct3": {
+ "type": "integer",
+ "value": "501"
+ }
+}
diff --git a/tests/data/valid/burntsushi/valid/integer/literals.toml b/tests/data/valid/burntsushi/valid/integer/literals.toml
new file mode 100644
index 0000000..a078590
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/integer/literals.toml
@@ -0,0 +1,11 @@
+bin1 = 0b11010110
+bin2 = 0b1_0_1
+
+oct1 = 0o01234567
+oct2 = 0o755
+oct3 = 0o7_6_5
+
+hex1 = 0xDEADBEEF
+hex2 = 0xdeadbeef
+hex3 = 0xdead_beef
+hex4 = 0x00987
diff --git a/tests/data/valid/burntsushi/valid/integer/long.json b/tests/data/valid/burntsushi/valid/integer/long.json
new file mode 100644
index 0000000..6f4f0a7
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/integer/long.json
@@ -0,0 +1,10 @@
+{
+ "int64-max": {
+ "type": "integer",
+ "value": "9223372036854775807"
+ },
+ "int64-max-neg": {
+ "type": "integer",
+ "value": "-9223372036854775808"
+ }
+}
diff --git a/tests/data/valid/burntsushi/valid/integer/long.toml b/tests/data/valid/burntsushi/valid/integer/long.toml
new file mode 100644
index 0000000..5db5ed7
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/integer/long.toml
@@ -0,0 +1,2 @@
+int64-max = 9223372036854775807
+int64-max-neg = -9223372036854775808
diff --git a/tests/data/valid/burntsushi/valid/integer/underscore.json b/tests/data/valid/burntsushi/valid/integer/underscore.json
new file mode 100644
index 0000000..10b9b59
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/integer/underscore.json
@@ -0,0 +1,10 @@
+{
+ "kilo": {
+ "type": "integer",
+ "value": "1000"
+ },
+ "x": {
+ "type": "integer",
+ "value": "1111"
+ }
+}
diff --git a/tests/data/valid/burntsushi/valid/integer/underscore.toml b/tests/data/valid/burntsushi/valid/integer/underscore.toml
new file mode 100644
index 0000000..7c2da5f
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/integer/underscore.toml
@@ -0,0 +1,2 @@
+kilo = 1_000
+x = 1_1_1_1
diff --git a/tests/data/valid/burntsushi/valid/integer/zero.json b/tests/data/valid/burntsushi/valid/integer/zero.json
new file mode 100644
index 0000000..9d5c707
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/integer/zero.json
@@ -0,0 +1,50 @@
+{
+ "a2": {
+ "type": "integer",
+ "value": "0"
+ },
+ "a3": {
+ "type": "integer",
+ "value": "0"
+ },
+ "b1": {
+ "type": "integer",
+ "value": "0"
+ },
+ "b2": {
+ "type": "integer",
+ "value": "0"
+ },
+ "b3": {
+ "type": "integer",
+ "value": "0"
+ },
+ "d1": {
+ "type": "integer",
+ "value": "0"
+ },
+ "d2": {
+ "type": "integer",
+ "value": "0"
+ },
+ "d3": {
+ "type": "integer",
+ "value": "0"
+ },
+ "h1": {
+ "type": "integer",
+ "value": "0"
+ },
+ "h2": {
+ "type": "integer",
+ "value": "0"
+ },
+ "h3": {
+ "type": "integer",
+ "value": "0"
+ },
+ "o1": {
+ "type": "integer",
+ "value": "0"
+ }
+}
diff --git a/tests/data/valid/burntsushi/valid/integer/zero.toml b/tests/data/valid/burntsushi/valid/integer/zero.toml
new file mode 100644
index 0000000..4687c28
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/integer/zero.toml
@@ -0,0 +1,15 @@
+d1 = 0
+d2 = +0
+d3 = -0
+
+h1 = 0x0
+h2 = 0x00
+h3 = 0x00000
+
+o1 = 0o0
+a2 = 0o00
+a3 = 0o00000
+
+b1 = 0b0
+b2 = 0b00
+b3 = 0b00000
diff --git a/tests/data/valid/burntsushi/valid/key/alphanum.json b/tests/data/valid/burntsushi/valid/key/alphanum.json
new file mode 100644
index 0000000..a54e1d3
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/key/alphanum.json
@@ -0,0 +1,46 @@
+{
+ "000111": {
+ "type": "string",
+ "value": "leading"
+ },
+ "10e3": {
+ "type": "string",
+ "value": "false float"
+ },
+ "123": {
+ "type": "string",
+ "value": "num"
+ },
+ "2018_10": {
+ "001": {
+ "type": "integer",
+ "value": "1"
+ }
+ },
+ "34-11": {
+ "type": "integer",
+ "value": "23"
+ },
+ "a-a-a": {
+ "_": {
+ "type": "bool",
+ "value": "false"
+ }
+ },
+ "alpha": {
+ "type": "string",
+ "value": "a"
+ },
+ "one1two2": {
+ "type": "string",
+ "value": "mixed"
+ },
+ "under_score": {
+ "type": "string",
+ "value": "___"
+ },
+ "with-dash": {
+ "type": "string",
+ "value": "dashed"
+ }
+}
diff --git a/tests/data/valid/burntsushi/valid/key/alphanum.toml b/tests/data/valid/burntsushi/valid/key/alphanum.toml
new file mode 100644
index 0000000..0632e9c
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/key/alphanum.toml
@@ -0,0 +1,14 @@
+alpha = "a"
+123 = "num"
+000111 = "leading"
+10e3 = "false float"
+one1two2 = "mixed"
+with-dash = "dashed"
+under_score = "___"
+34-11 = 23
+
+[2018_10]
+001 = 1
+
+[a-a-a]
+_ = false
diff --git a/tests/data/valid/burntsushi/valid/key/case-sensitive.json b/tests/data/valid/burntsushi/valid/key/case-sensitive.json
new file mode 100644
index 0000000..1f205d2
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/key/case-sensitive.json
@@ -0,0 +1,38 @@
+{
+ "Section": {
+ "M": {
+ "type": "string",
+ "value": "latin letter M"
+ },
+ "name": {
+ "type": "string",
+ "value": "different section!!"
+ },
+ "Μ": {
+ "type": "string",
+ "value": "greek capital letter MU"
+ },
+ "μ": {
+ "type": "string",
+ "value": "greek small letter mu"
+ }
+ },
+ "sectioN": {
+ "type": "string",
+ "value": "NN"
+ },
+ "section": {
+ "NAME": {
+ "type": "string",
+ "value": "upper"
+ },
+ "Name": {
+ "type": "string",
+ "value": "capitalized"
+ },
+ "name": {
+ "type": "string",
+ "value": "lower"
+ }
+ }
+}
diff --git a/tests/data/valid/burntsushi/valid/key/case-sensitive.toml b/tests/data/valid/burntsushi/valid/key/case-sensitive.toml
new file mode 100644
index 0000000..e02b3a5
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/key/case-sensitive.toml
@@ -0,0 +1,13 @@
+sectioN = "NN"
+
+[section]
+name = "lower"
+NAME = "upper"
+Name = "capitalized"
+
+[Section]
+name = "different section!!"
+"μ" = "greek small letter mu"
+"Μ" = "greek capital letter MU"
+M = "latin letter M"
+
diff --git a/tests/data/valid/burntsushi/valid/key/dotted.json b/tests/data/valid/burntsushi/valid/key/dotted.json
new file mode 100644
index 0000000..a527a72
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/key/dotted.json
@@ -0,0 +1,132 @@
+{
+ "a": {
+ "few": {
+ "dots": {
+ "polka": {
+ "dance-with": {
+ "type": "string",
+ "value": "Dot"
+ },
+ "dot": {
+ "type": "string",
+ "value": "again?"
+ }
+ }
+ }
+ }
+ },
+ "arr": [
+ {
+ "a": {
+ "b": {
+ "c": {
+ "type": "integer",
+ "value": "1"
+ },
+ "d": {
+ "type": "integer",
+ "value": "2"
+ }
+ }
+ }
+ },
+ {
+ "a": {
+ "b": {
+ "c": {
+ "type": "integer",
+ "value": "3"
+ },
+ "d": {
+ "type": "integer",
+ "value": "4"
+ }
+ }
+ }
+ }
+ ],
+ "count": {
+ "a": {
+ "type": "integer",
+ "value": "1"
+ },
+ "b": {
+ "type": "integer",
+ "value": "2"
+ },
+ "c": {
+ "type": "integer",
+ "value": "3"
+ },
+ "d": {
+ "type": "integer",
+ "value": "4"
+ },
+ "e": {
+ "type": "integer",
+ "value": "5"
+ },
+ "f": {
+ "type": "integer",
+ "value": "6"
+ },
+ "g": {
+ "type": "integer",
+ "value": "7"
+ },
+ "h": {
+ "type": "integer",
+ "value": "8"
+ },
+ "i": {
+ "type": "integer",
+ "value": "9"
+ },
+ "j": {
+ "type": "integer",
+ "value": "10"
+ },
+ "k": {
+ "type": "integer",
+ "value": "11"
+ },
+ "l": {
+ "type": "integer",
+ "value": "12"
+ }
+ },
+ "many": {
+ "dots": {
+ "here": {
+ "dot": {
+ "dot": {
+ "dot": {
+ "type": "integer",
+ "value": "42"
+ }
+ }
+ }
+ }
+ }
+ },
+ "name": {
+ "first": {
+ "type": "string",
+ "value": "Arthur"
+ },
+ "last": {
+ "type": "string",
+ "value": "Dent"
+ }
+ },
+ "tbl": {
+ "a": {
+ "b": {
+ "c": {
+ "type": "float",
+ "value": "42.666"
+ }
+ }
+ }
+ }
+}
diff --git a/tests/data/valid/burntsushi/valid/key/dotted.toml b/tests/data/valid/burntsushi/valid/key/dotted.toml
new file mode 100644
index 0000000..52d62d7
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/key/dotted.toml
@@ -0,0 +1,35 @@
+# Note: this file contains literal tab characters.
+
+name.first = "Arthur"
+"name".'last' = "Dent"
+
+many.dots.here.dot.dot.dot = 42
+
+# Space are ignored, and key parts can be quoted.
+count.a = 1
+count . b = 2
+"count"."c" = 3
+"count" . "d" = 4
+'count'.'e' = 5
+'count' . 'f' = 6
+"count".'g' = 7
+"count" . 'h' = 8
+count.'i' = 9
+count . 'j' = 10
+"count".k = 11
+"count" . l = 12
+
+[tbl]
+a.b.c = 42.666
+
+[a.few.dots]
+polka.dot = "again?"
+polka.dance-with = "Dot"
+
+[[arr]]
+a.b.c=1
+a.b.d=2
+
+[[arr]]
+a.b.c=3
+a.b.d=4
diff --git a/tests/data/valid/burntsushi/valid/key/empty.json b/tests/data/valid/burntsushi/valid/key/empty.json
new file mode 100644
index 0000000..44948a9
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/key/empty.json
@@ -0,0 +1,6 @@
+{
+ "": {
+ "type": "string",
+ "value": "blank"
+ }
+}
diff --git a/tests/data/valid/burntsushi/valid/key/empty.toml b/tests/data/valid/burntsushi/valid/key/empty.toml
new file mode 100644
index 0000000..0a1640d
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/key/empty.toml
@@ -0,0 +1 @@
+"" = "blank"
diff --git a/tests/data/valid/burntsushi/valid/key/equals-nospace.json b/tests/data/valid/burntsushi/valid/key/equals-nospace.json
new file mode 100644
index 0000000..9394e56
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/key/equals-nospace.json
@@ -0,0 +1,6 @@
+{
+ "answer": {
+ "type": "integer",
+ "value": "42"
+ }
+}
diff --git a/tests/data/valid/burntsushi/valid/key/equals-nospace.toml b/tests/data/valid/burntsushi/valid/key/equals-nospace.toml
new file mode 100644
index 0000000..560901c
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/key/equals-nospace.toml
@@ -0,0 +1 @@
+answer=42
diff --git a/tests/data/valid/burntsushi/valid/key/escapes.json b/tests/data/valid/burntsushi/valid/key/escapes.json
new file mode 100644
index 0000000..e62b3a1
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/key/escapes.json
@@ -0,0 +1,24 @@
+{
+ "\n": {
+ "type": "string",
+ "value": "newline"
+ },
+ "\"": {
+ "type": "string",
+ "value": "just a quote"
+ },
+ "\"quoted\"": {
+ "quote": {
+ "type": "bool",
+ "value": "true"
+ }
+ },
+ "a.b": {
+ "À": {}
+ },
+ "backsp\u0008\u0008": {},
+ "À": {
+ "type": "string",
+ "value": "latin capital letter A with grave"
+ }
+}
diff --git a/tests/data/valid/burntsushi/valid/key/escapes.toml b/tests/data/valid/burntsushi/valid/key/escapes.toml
new file mode 100644
index 0000000..aac3c0a
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/key/escapes.toml
@@ -0,0 +1,10 @@
+"\n" = "newline"
+"\u00c0" = "latin capital letter A with grave"
+"\"" = "just a quote"
+
+["backsp\b\b"]
+
+["\"quoted\""]
+quote = true
+
+["a.b"."\u00c0"]
diff --git a/tests/data/valid/burntsushi/valid/key/numeric-dotted.json b/tests/data/valid/burntsushi/valid/key/numeric-dotted.json
new file mode 100644
index 0000000..43dd4d1
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/key/numeric-dotted.json
@@ -0,0 +1,8 @@
+{
+ "1": {
+ "2": {
+ "type": "integer",
+ "value": "3"
+ }
+ }
+}
diff --git a/tests/data/valid/burntsushi/valid/key/numeric-dotted.toml b/tests/data/valid/burntsushi/valid/key/numeric-dotted.toml
new file mode 100644
index 0000000..538204c
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/key/numeric-dotted.toml
@@ -0,0 +1 @@
+1.2 = 3
diff --git a/tests/data/valid/burntsushi/valid/key/numeric.json b/tests/data/valid/burntsushi/valid/key/numeric.json
new file mode 100644
index 0000000..eddb88b
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/key/numeric.json
@@ -0,0 +1,6 @@
+{
+ "1": {
+ "type": "integer",
+ "value": "1"
+ }
+}
diff --git a/tests/data/valid/burntsushi/valid/key/numeric.toml b/tests/data/valid/burntsushi/valid/key/numeric.toml
new file mode 100644
index 0000000..532356f
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/key/numeric.toml
@@ -0,0 +1 @@
+1 = 1
diff --git a/tests/data/valid/burntsushi/valid/key/quoted-dots.json b/tests/data/valid/burntsushi/valid/key/quoted-dots.json
new file mode 100644
index 0000000..1582c5b
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/key/quoted-dots.json
@@ -0,0 +1,32 @@
+{
+ "plain": {
+ "type": "integer",
+ "value": "1"
+ },
+ "plain_table": {
+ "plain": {
+ "type": "integer",
+ "value": "3"
+ },
+ "with.dot": {
+ "type": "integer",
+ "value": "4"
+ }
+ },
+ "table": {
+ "withdot": {
+ "key.with.dots": {
+ "type": "integer",
+ "value": "6"
+ },
+ "plain": {
+ "type": "integer",
+ "value": "5"
+ }
+ }
+ },
+ "with.dot": {
+ "type": "integer",
+ "value": "2"
+ }
+}
diff --git a/tests/data/valid/burntsushi/valid/key/quoted-dots.toml b/tests/data/valid/burntsushi/valid/key/quoted-dots.toml
new file mode 100644
index 0000000..65fcddf
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/key/quoted-dots.toml
@@ -0,0 +1,10 @@
+plain = 1
+"with.dot" = 2
+
+[plain_table]
+plain = 3
+"with.dot" = 4
+
+[table.withdot]
+plain = 5
+"key.with.dots" = 6
diff --git a/tests/data/valid/burntsushi/valid/key/space.json b/tests/data/valid/burntsushi/valid/key/space.json
new file mode 100644
index 0000000..6d95f1a
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/key/space.json
@@ -0,0 +1,6 @@
+{
+ "a b": {
+ "type": "integer",
+ "value": "1"
+ }
+}
diff --git a/tests/data/valid/burntsushi/valid/key/space.toml b/tests/data/valid/burntsushi/valid/key/space.toml
new file mode 100644
index 0000000..f4f36c4
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/key/space.toml
@@ -0,0 +1 @@
+"a b" = 1
diff --git a/tests/data/valid/burntsushi/valid/key/special-chars.json b/tests/data/valid/burntsushi/valid/key/special-chars.json
new file mode 100644
index 0000000..6084047
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/key/special-chars.json
@@ -0,0 +1,6 @@
+{
+ "~!@$^\u0026*()_+-`1234567890[]|/?\u003e\u003c.,;:'": {
+ "type": "integer",
+ "value": "1"
+ }
+}
diff --git a/tests/data/valid/burntsushi/valid/key/special-chars.toml b/tests/data/valid/burntsushi/valid/key/special-chars.toml
new file mode 100644
index 0000000..cc572be
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/key/special-chars.toml
@@ -0,0 +1 @@
+"~!@$^&*()_+-`1234567890[]|/?><.,;:'" = 1
diff --git a/tests/data/valid/burntsushi/valid/key/special-word.json b/tests/data/valid/burntsushi/valid/key/special-word.json
new file mode 100644
index 0000000..59ce693
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/key/special-word.json
@@ -0,0 +1,18 @@
+{
+ "false": {
+ "type": "bool",
+ "value": "false"
+ },
+ "inf": {
+ "type": "integer",
+ "value": "100000000"
+ },
+ "nan": {
+ "type": "string",
+ "value": "ceci n'est pas un nombre"
+ },
+ "true": {
+ "type": "integer",
+ "value": "1"
+ }
+}
diff --git a/tests/data/valid/burntsushi/valid/key/special-word.toml b/tests/data/valid/burntsushi/valid/key/special-word.toml
new file mode 100644
index 0000000..0b836f1
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/key/special-word.toml
@@ -0,0 +1,5 @@
+false = false
+true = 1
+inf = 100000000
+nan = "ceci n'est pas un nombre"
+
diff --git a/tests/data/valid/burntsushi/valid/newline-crlf.json b/tests/data/valid/burntsushi/valid/newline-crlf.json
new file mode 100644
index 0000000..acf617e
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/newline-crlf.json
@@ -0,0 +1,10 @@
+{
+ "newline": {
+ "type": "string",
+ "value": "crlf"
+ },
+ "os": {
+ "type": "string",
+ "value": "DOS"
+ }
+}
diff --git a/tests/data/valid/burntsushi/valid/newline-crlf.toml b/tests/data/valid/burntsushi/valid/newline-crlf.toml
new file mode 100644
index 0000000..0030024
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/newline-crlf.toml
@@ -0,0 +1,2 @@
+os = "DOS"
+newline = "crlf"
diff --git a/tests/data/valid/burntsushi/valid/newline-lf.json b/tests/data/valid/burntsushi/valid/newline-lf.json
new file mode 100644
index 0000000..66cf871
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/newline-lf.json
@@ -0,0 +1,10 @@
+{
+ "newline": {
+ "type": "string",
+ "value": "lf"
+ },
+ "os": {
+ "type": "string",
+ "value": "unix"
+ }
+}
diff --git a/tests/data/valid/burntsushi/valid/newline-lf.toml b/tests/data/valid/burntsushi/valid/newline-lf.toml
new file mode 100644
index 0000000..0f3377c
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/newline-lf.toml
@@ -0,0 +1,2 @@
+os = "unix"
+newline = "lf"
diff --git a/tests/data/valid/burntsushi/valid/spec-example-1-compact.json b/tests/data/valid/burntsushi/valid/spec-example-1-compact.json
new file mode 100644
index 0000000..9f4078a
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/spec-example-1-compact.json
@@ -0,0 +1,100 @@
+{
+ "clients": {
+ "data": [
+ [
+ {
+ "type": "string",
+ "value": "gamma"
+ },
+ {
+ "type": "string",
+ "value": "delta"
+ }
+ ],
+ [
+ {
+ "type": "integer",
+ "value": "1"
+ },
+ {
+ "type": "integer",
+ "value": "2"
+ }
+ ]
+ ],
+ "hosts": [
+ {
+ "type": "string",
+ "value": "alpha"
+ },
+ {
+ "type": "string",
+ "value": "omega"
+ }
+ ]
+ },
+ "database": {
+ "connection_max": {
+ "type": "integer",
+ "value": "5000"
+ },
+ "enabled": {
+ "type": "bool",
+ "value": "true"
+ },
+ "ports": [
+ {
+ "type": "integer",
+ "value": "8001"
+ },
+ {
+ "type": "integer",
+ "value": "8001"
+ },
+ {
+ "type": "integer",
+ "value": "8002"
+ }
+ ],
+ "server": {
+ "type": "string",
+ "value": "192.168.1.1"
+ }
+ },
+ "owner": {
+ "dob": {
+ "type": "datetime",
+ "value": "1979-05-27T07:32:00-08:00"
+ },
+ "name": {
+ "type": "string",
+ "value": "Lance Uppercut"
+ }
+ },
+ "servers": {
+ "alpha": {
+ "dc": {
+ "type": "string",
+ "value": "eqdc10"
+ },
+ "ip": {
+ "type": "string",
+ "value": "10.0.0.1"
+ }
+ },
+ "beta": {
+ "dc": {
+ "type": "string",
+ "value": "eqdc10"
+ },
+ "ip": {
+ "type": "string",
+ "value": "10.0.0.2"
+ }
+ }
+ },
+ "title": {
+ "type": "string",
+ "value": "TOML Example"
+ }
+}
diff --git a/tests/data/valid/burntsushi/valid/spec-example-1-compact.toml b/tests/data/valid/burntsushi/valid/spec-example-1-compact.toml
new file mode 100644
index 0000000..15e2b84
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/spec-example-1-compact.toml
@@ -0,0 +1,23 @@
+#Useless spaces eliminated.
+title="TOML Example"
+[owner]
+name="Lance Uppercut"
+dob=1979-05-27T07:32:00-08:00#First class dates
+[database]
+server="192.168.1.1"
+ports=[8001,8001,8002]
+connection_max=5000
+enabled=true
+[servers]
+[servers.alpha]
+ip="10.0.0.1"
+dc="eqdc10"
+[servers.beta]
+ip="10.0.0.2"
+dc="eqdc10"
+[clients]
+data=[["gamma","delta"],[1,2]]
+hosts=[
+"alpha",
+"omega"
+]
diff --git a/tests/data/valid/burntsushi/valid/spec-example-1.json b/tests/data/valid/burntsushi/valid/spec-example-1.json
new file mode 100644
index 0000000..9f4078a
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/spec-example-1.json
@@ -0,0 +1,100 @@
+{
+ "clients": {
+ "data": [
+ [
+ {
+ "type": "string",
+ "value": "gamma"
+ },
+ {
+ "type": "string",
+ "value": "delta"
+ }
+ ],
+ [
+ {
+ "type": "integer",
+ "value": "1"
+ },
+ {
+ "type": "integer",
+ "value": "2"
+ }
+ ]
+ ],
+ "hosts": [
+ {
+ "type": "string",
+ "value": "alpha"
+ },
+ {
+ "type": "string",
+ "value": "omega"
+ }
+ ]
+ },
+ "database": {
+ "connection_max": {
+ "type": "integer",
+ "value": "5000"
+ },
+ "enabled": {
+ "type": "bool",
+ "value": "true"
+ },
+ "ports": [
+ {
+ "type": "integer",
+ "value": "8001"
+ },
+ {
+ "type": "integer",
+ "value": "8001"
+ },
+ {
+ "type": "integer",
+ "value": "8002"
+ }
+ ],
+ "server": {
+ "type": "string",
+ "value": "192.168.1.1"
+ }
+ },
+ "owner": {
+ "dob": {
+ "type": "datetime",
+ "value": "1979-05-27T07:32:00-08:00"
+ },
+ "name": {
+ "type": "string",
+ "value": "Lance Uppercut"
+ }
+ },
+ "servers": {
+ "alpha": {
+ "dc": {
+ "type": "string",
+ "value": "eqdc10"
+ },
+ "ip": {
+ "type": "string",
+ "value": "10.0.0.1"
+ }
+ },
+ "beta": {
+ "dc": {
+ "type": "string",
+ "value": "eqdc10"
+ },
+ "ip": {
+ "type": "string",
+ "value": "10.0.0.2"
+ }
+ }
+ },
+ "title": {
+ "type": "string",
+ "value": "TOML Example"
+ }
+}
diff --git a/tests/data/valid/burntsushi/valid/spec-example-1.toml b/tests/data/valid/burntsushi/valid/spec-example-1.toml
new file mode 100644
index 0000000..52fd1e8
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/spec-example-1.toml
@@ -0,0 +1,33 @@
+# This is a TOML document. Boom.
+
+title = "TOML Example"
+
+[owner]
+name = "Lance Uppercut"
+dob = 1979-05-27T07:32:00-08:00 # First class dates? Why not?
+
+[database]
+server = "192.168.1.1"
+ports = [ 8001, 8001, 8002 ]
+connection_max = 5000
+enabled = true
+
+[servers]
+
+ # You can indent as you please. Tabs or spaces. TOML don't care.
+ [servers.alpha]
+ ip = "10.0.0.1"
+ dc = "eqdc10"
+
+ [servers.beta]
+ ip = "10.0.0.2"
+ dc = "eqdc10"
+
+[clients]
+data = [ ["gamma", "delta"], [1, 2] ]
+
+# Line breaks are OK when inside arrays
+hosts = [
+ "alpha",
+ "omega"
+]
diff --git a/tests/data/valid/burntsushi/valid/string/double-quote-escape.json b/tests/data/valid/burntsushi/valid/string/double-quote-escape.json
new file mode 100644
index 0000000..0c4ac37
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/string/double-quote-escape.json
@@ -0,0 +1,6 @@
+{
+ "test": {
+ "type": "string",
+ "value": "\"one\""
+ }
+}
diff --git a/tests/data/valid/burntsushi/valid/string/double-quote-escape.toml b/tests/data/valid/burntsushi/valid/string/double-quote-escape.toml
new file mode 100644
index 0000000..78e7e72
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/string/double-quote-escape.toml
@@ -0,0 +1 @@
+test = "\"one\""
diff --git a/tests/data/valid/burntsushi/valid/string/empty.json b/tests/data/valid/burntsushi/valid/string/empty.json
new file mode 100644
index 0000000..efe96c3
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/string/empty.json
@@ -0,0 +1,6 @@
+{
+ "answer": {
+ "type": "string",
+ "value": ""
+ }
+}
diff --git a/tests/data/valid/burntsushi/valid/string/empty.toml b/tests/data/valid/burntsushi/valid/string/empty.toml
new file mode 100644
index 0000000..e37e681
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/string/empty.toml
@@ -0,0 +1 @@
+answer = ""
diff --git a/tests/data/valid/burntsushi/valid/string/escape-tricky.json b/tests/data/valid/burntsushi/valid/string/escape-tricky.json
new file mode 100644
index 0000000..572e0a5
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/string/escape-tricky.json
@@ -0,0 +1,30 @@
+{
+ "end_esc": {
+ "type": "string",
+ "value": "String does not end here\" but ends here\\"
+ },
+ "lit_end_esc": {
+ "type": "string",
+ "value": "String ends here\\"
+ },
+ "lit_multiline_end": {
+ "type": "string",
+ "value": "There is no escape\\"
+ },
+ "lit_multiline_not_unicode": {
+ "type": "string",
+ "value": "\\u007f"
+ },
+ "multiline_end_esc": {
+ "type": "string",
+ "value": "When will it end? \"\"\"...\"\"\" should be here\""
+ },
+ "multiline_not_unicode": {
+ "type": "string",
+ "value": "\\u0041"
+ },
+ "multiline_unicode": {
+ "type": "string",
+ "value": " "
+ }
+}
diff --git a/tests/data/valid/burntsushi/valid/string/escape-tricky.toml b/tests/data/valid/burntsushi/valid/string/escape-tricky.toml
new file mode 100644
index 0000000..dc204cb
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/string/escape-tricky.toml
@@ -0,0 +1,15 @@
+end_esc = "String does not end here\" but ends here\\"
+lit_end_esc = 'String ends here\'
+
+multiline_unicode = """
+\u00a0"""
+
+multiline_not_unicode = """
+\\u0041"""
+
+multiline_end_esc = """When will it end? \"""...""\" should be here\""""
+
+lit_multiline_not_unicode = '''
+\u007f'''
+
+lit_multiline_end = '''There is no escape\'''
diff --git a/tests/data/valid/burntsushi/valid/string/escaped-escape.json b/tests/data/valid/burntsushi/valid/string/escaped-escape.json
new file mode 100644
index 0000000..112c0c9
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/string/escaped-escape.json
@@ -0,0 +1,6 @@
+{
+ "answer": {
+ "type": "string",
+ "value": "\\x64"
+ }
+}
diff --git a/tests/data/valid/burntsushi/valid/string/escaped-escape.toml b/tests/data/valid/burntsushi/valid/string/escaped-escape.toml
new file mode 100644
index 0000000..d575876
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/string/escaped-escape.toml
@@ -0,0 +1 @@
+answer = "\\x64"
diff --git a/tests/data/valid/burntsushi/valid/string/escapes.json b/tests/data/valid/burntsushi/valid/string/escapes.json
new file mode 100644
index 0000000..d849574
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/string/escapes.json
@@ -0,0 +1,54 @@
+{
+ "backslash": {
+ "type": "string",
+ "value": "This string has a \\ backslash character."
+ },
+ "backspace": {
+ "type": "string",
+ "value": "This string has a \u0008 backspace character."
+ },
+ "carriage": {
+ "type": "string",
+ "value": "This string has a \r carriage return character."
+ },
+ "delete": {
+ "type": "string",
+ "value": "This string has a  delete control code."
+ },
+ "formfeed": {
+ "type": "string",
+ "value": "This string has a \u000c form feed character."
+ },
+ "newline": {
+ "type": "string",
+ "value": "This string has a \n new line character."
+ },
+ "notunicode1": {
+ "type": "string",
+ "value": "This string does not have a unicode \\u escape."
+ },
+ "notunicode2": {
+ "type": "string",
+ "value": "This string does not have a unicode \\u escape."
+ },
+ "notunicode3": {
+ "type": "string",
+ "value": "This string does not have a unicode \\u0075 escape."
+ },
+ "notunicode4": {
+ "type": "string",
+ "value": "This string does not have a unicode \\u escape."
+ },
+ "quote": {
+ "type": "string",
+ "value": "This string has a \" quote character."
+ },
+ "tab": {
+ "type": "string",
+ "value": "This string has a \t tab character."
+ },
+ "unitseparator": {
+ "type": "string",
+ "value": "This string has a \u001f unit separator control code."
+ }
+}
diff --git a/tests/data/valid/burntsushi/valid/string/escapes.toml b/tests/data/valid/burntsushi/valid/string/escapes.toml
new file mode 100644
index 0000000..78f7ebd
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/string/escapes.toml
@@ -0,0 +1,13 @@
+backspace = "This string has a \b backspace character."
+tab = "This string has a \t tab character."
+newline = "This string has a \n new line character."
+formfeed = "This string has a \f form feed character."
+carriage = "This string has a \r carriage return character."
+quote = "This string has a \" quote character."
+backslash = "This string has a \\ backslash character."
+notunicode1 = "This string does not have a unicode \\u escape."
+notunicode2 = "This string does not have a unicode \u005Cu escape."
+notunicode3 = "This string does not have a unicode \\u0075 escape."
+notunicode4 = "This string does not have a unicode \\\u0075 escape."
+delete = "This string has a \u007F delete control code."
+unitseparator = "This string has a \u001F unit separator control code."
diff --git a/tests/data/valid/burntsushi/valid/string/multiline-quotes.json b/tests/data/valid/burntsushi/valid/string/multiline-quotes.json
new file mode 100644
index 0000000..c134f67
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/string/multiline-quotes.json
@@ -0,0 +1,42 @@
+{
+ "lit_one": {
+ "type": "string",
+ "value": "'one quote'"
+ },
+ "lit_one_space": {
+ "type": "string",
+ "value": " 'one quote' "
+ },
+ "lit_two": {
+ "type": "string",
+ "value": "''two quotes''"
+ },
+ "lit_two_space": {
+ "type": "string",
+ "value": " ''two quotes'' "
+ },
+ "mismatch1": {
+ "type": "string",
+ "value": "aaa'''bbb"
+ },
+ "mismatch2": {
+ "type": "string",
+ "value": "aaa\"\"\"bbb"
+ },
+ "one": {
+ "type": "string",
+ "value": "\"one quote\""
+ },
+ "one_space": {
+ "type": "string",
+ "value": " \"one quote\" "
+ },
+ "two": {
+ "type": "string",
+ "value": "\"\"two quotes\"\""
+ },
+ "two_space": {
+ "type": "string",
+ "value": " \"\"two quotes\"\" "
+ }
+}
diff --git a/tests/data/valid/burntsushi/valid/string/multiline-quotes.toml b/tests/data/valid/burntsushi/valid/string/multiline-quotes.toml
new file mode 100644
index 0000000..e138e2f
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/string/multiline-quotes.toml
@@ -0,0 +1,15 @@
+# Make sure that quotes inside multiline strings are allowed, including right
+# after the opening '''/""" and before the closing '''/"""
+
+lit_one = ''''one quote''''
+lit_two = '''''two quotes'''''
+lit_one_space = ''' 'one quote' '''
+lit_two_space = ''' ''two quotes'' '''
+
+one = """"one quote""""
+two = """""two quotes"""""
+one_space = """ "one quote" """
+two_space = """ ""two quotes"" """
+
+mismatch1 = """aaa'''bbb"""
+mismatch2 = '''aaa"""bbb'''
diff --git a/tests/data/valid/burntsushi/valid/string/multiline.json b/tests/data/valid/burntsushi/valid/string/multiline.json
new file mode 100644
index 0000000..66e572b
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/string/multiline.json
@@ -0,0 +1,54 @@
+{
+ "equivalent_one": {
+ "type": "string",
+ "value": "The quick brown fox jumps over the lazy dog."
+ },
+ "equivalent_three": {
+ "type": "string",
+ "value": "The quick brown fox jumps over the lazy dog."
+ },
+ "equivalent_two": {
+ "type": "string",
+ "value": "The quick brown fox jumps over the lazy dog."
+ },
+ "escape-bs-1": {
+ "type": "string",
+ "value": "a \\\nb"
+ },
+ "escape-bs-2": {
+ "type": "string",
+ "value": "a \\b"
+ },
+ "escape-bs-3": {
+ "type": "string",
+ "value": "a \\\\\n b"
+ },
+ "keep-ws-before": {
+ "type": "string",
+ "value": "a \tb"
+ },
+ "multiline_empty_four": {
+ "type": "string",
+ "value": ""
+ },
+ "multiline_empty_one": {
+ "type": "string",
+ "value": ""
+ },
+ "multiline_empty_three": {
+ "type": "string",
+ "value": ""
+ },
+ "multiline_empty_two": {
+ "type": "string",
+ "value": ""
+ },
+ "no-space": {
+ "type": "string",
+ "value": "ab"
+ },
+ "whitespace-after-bs": {
+ "type": "string",
+ "value": "The quick brown fox jumps over the lazy dog."
+ }
+}
diff --git a/tests/data/valid/burntsushi/valid/string/multiline.toml b/tests/data/valid/burntsushi/valid/string/multiline.toml
new file mode 100644
index 0000000..f3b3c2e
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/string/multiline.toml
@@ -0,0 +1,52 @@
+# NOTE: this file includes some literal tab characters.
+
+multiline_empty_one = """"""
+
+# A newline immediately following the opening delimiter will be trimmed.
+multiline_empty_two = """
+"""
+
+# \ at the end of line trims newlines as well; note that last \ is followed by
+# two spaces, which are ignored.
+multiline_empty_three = """\
+ """
+multiline_empty_four = """\
+ \
+ \
+ """
+
+equivalent_one = "The quick brown fox jumps over the lazy dog."
+equivalent_two = """
+The quick brown \
+
+
+ fox jumps over \
+ the lazy dog."""
+
+equivalent_three = """\
+ The quick brown \
+ fox jumps over \
+ the lazy dog.\
+ """
+
+whitespace-after-bs = """\
+ The quick brown \
+ fox jumps over \
+ the lazy dog.\
+ """
+
+no-space = """a\
+ b"""
+
+# Has tab character.
+keep-ws-before = """a \
+ b"""
+
+escape-bs-1 = """a \\
+b"""
+
+escape-bs-2 = """a \\\
+b"""
+
+escape-bs-3 = """a \\\\
+ b"""
diff --git a/tests/data/valid/burntsushi/valid/string/nl.json b/tests/data/valid/burntsushi/valid/string/nl.json
new file mode 100644
index 0000000..8eae09a
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/string/nl.json
@@ -0,0 +1,22 @@
+{
+ "lit_nl_end": {
+ "type": "string",
+ "value": "value\\n"
+ },
+ "lit_nl_mid": {
+ "type": "string",
+ "value": "val\\nue"
+ },
+ "lit_nl_uni": {
+ "type": "string",
+ "value": "val\\ue"
+ },
+ "nl_end": {
+ "type": "string",
+ "value": "value\n"
+ },
+ "nl_mid": {
+ "type": "string",
+ "value": "val\nue"
+ }
+}
diff --git a/tests/data/valid/burntsushi/valid/string/nl.toml b/tests/data/valid/burntsushi/valid/string/nl.toml
new file mode 100644
index 0000000..1e09a8b
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/string/nl.toml
@@ -0,0 +1,6 @@
+nl_mid = "val\nue"
+nl_end = """value\n"""
+
+lit_nl_end = '''value\n'''
+lit_nl_mid = 'val\nue'
+lit_nl_uni = 'val\ue'
diff --git a/tests/data/valid/burntsushi/valid/string/raw-multiline.json b/tests/data/valid/burntsushi/valid/string/raw-multiline.json
new file mode 100644
index 0000000..4d195ec
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/string/raw-multiline.json
@@ -0,0 +1,14 @@
+{
+ "firstnl": {
+ "type": "string",
+ "value": "This string has a ' quote character."
+ },
+ "multiline": {
+ "type": "string",
+ "value": "This string\nhas ' a quote character\nand more than\none newline\nin it."
+ },
+ "oneline": {
+ "type": "string",
+ "value": "This string has a ' quote character."
+ }
+}
diff --git a/tests/data/valid/burntsushi/valid/string/raw-multiline.toml b/tests/data/valid/burntsushi/valid/string/raw-multiline.toml
new file mode 100644
index 0000000..293f803
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/string/raw-multiline.toml
@@ -0,0 +1,14 @@
+# Single ' should be allowed.
+oneline = '''This string has a ' quote character.'''
+
+# A newline immediately following the opening delimiter will be trimmed.
+firstnl = '''
+This string has a ' quote character.'''
+
+# All other whitespace and newline characters remain intact.
+multiline = '''
+This string
+has ' a quote character
+and more than
+one newline
+in it.'''
diff --git a/tests/data/valid/burntsushi/valid/string/raw.json b/tests/data/valid/burntsushi/valid/string/raw.json
new file mode 100644
index 0000000..6b753a3
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/string/raw.json
@@ -0,0 +1,30 @@
+{
+ "backslash": {
+ "type": "string",
+ "value": "This string has a \\\\ backslash character."
+ },
+ "backspace": {
+ "type": "string",
+ "value": "This string has a \\b backspace character."
+ },
+ "carriage": {
+ "type": "string",
+ "value": "This string has a \\r carriage return character."
+ },
+ "formfeed": {
+ "type": "string",
+ "value": "This string has a \\f form feed character."
+ },
+ "newline": {
+ "type": "string",
+ "value": "This string has a \\n new line character."
+ },
+ "slash": {
+ "type": "string",
+ "value": "This string has a \\/ slash character."
+ },
+ "tab": {
+ "type": "string",
+ "value": "This string has a \\t tab character."
+ }
+}
diff --git a/tests/data/valid/burntsushi/valid/string/raw.toml b/tests/data/valid/burntsushi/valid/string/raw.toml
new file mode 100644
index 0000000..92acd25
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/string/raw.toml
@@ -0,0 +1,7 @@
+backspace = 'This string has a \b backspace character.'
+tab = 'This string has a \t tab character.'
+newline = 'This string has a \n new line character.'
+formfeed = 'This string has a \f form feed character.'
+carriage = 'This string has a \r carriage return character.'
+slash = 'This string has a \/ slash character.'
+backslash = 'This string has a \\ backslash character.'
diff --git a/tests/data/valid/burntsushi/valid/string/simple.json b/tests/data/valid/burntsushi/valid/string/simple.json
new file mode 100644
index 0000000..2561cda
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/string/simple.json
@@ -0,0 +1,6 @@
+{
+ "answer": {
+ "type": "string",
+ "value": "You are not drinking enough whisky."
+ }
+}
diff --git a/tests/data/valid/burntsushi/valid/string/simple.toml b/tests/data/valid/burntsushi/valid/string/simple.toml
new file mode 100644
index 0000000..e17ade6
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/string/simple.toml
@@ -0,0 +1 @@
+answer = "You are not drinking enough whisky."
diff --git a/tests/data/valid/burntsushi/valid/string/unicode-escape.json b/tests/data/valid/burntsushi/valid/string/unicode-escape.json
new file mode 100644
index 0000000..9ae728b
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/string/unicode-escape.json
@@ -0,0 +1,10 @@
+{
+ "answer4": {
+ "type": "string",
+ "value": "δ"
+ },
+ "answer8": {
+ "type": "string",
+ "value": "δ"
+ }
+}
diff --git a/tests/data/valid/burntsushi/valid/string/unicode-escape.toml b/tests/data/valid/burntsushi/valid/string/unicode-escape.toml
new file mode 100644
index 0000000..82faecb
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/string/unicode-escape.toml
@@ -0,0 +1,2 @@
+answer4 = "\u03B4"
+answer8 = "\U000003B4"
diff --git a/tests/data/valid/burntsushi/valid/string/unicode-literal.json b/tests/data/valid/burntsushi/valid/string/unicode-literal.json
new file mode 100644
index 0000000..7f15df4
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/string/unicode-literal.json
@@ -0,0 +1,6 @@
+{
+ "answer": {
+ "type": "string",
+ "value": "δ"
+ }
+}
diff --git a/tests/data/valid/burntsushi/valid/string/unicode-literal.toml b/tests/data/valid/burntsushi/valid/string/unicode-literal.toml
new file mode 100644
index 0000000..c65723c
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/string/unicode-literal.toml
@@ -0,0 +1 @@
+answer = "δ"
diff --git a/tests/data/valid/burntsushi/valid/string/with-pound.json b/tests/data/valid/burntsushi/valid/string/with-pound.json
new file mode 100644
index 0000000..2cb8beb
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/string/with-pound.json
@@ -0,0 +1,10 @@
+{
+ "pound": {
+ "type": "string",
+ "value": "We see no # comments here."
+ },
+ "poundcomment": {
+ "type": "string",
+ "value": "But there are # some comments here."
+ }
+}
diff --git a/tests/data/valid/burntsushi/valid/string/with-pound.toml b/tests/data/valid/burntsushi/valid/string/with-pound.toml
new file mode 100644
index 0000000..5fd8746
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/string/with-pound.toml
@@ -0,0 +1,2 @@
+pound = "We see no # comments here."
+poundcomment = "But there are # some comments here." # Did I # mess you up?
diff --git a/tests/data/valid/burntsushi/valid/table/array-implicit.json b/tests/data/valid/burntsushi/valid/table/array-implicit.json
new file mode 100644
index 0000000..ee164c5
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/table/array-implicit.json
@@ -0,0 +1,12 @@
+{
+ "albums": {
+ "songs": [
+ {
+ "name": {
+ "type": "string",
+ "value": "Glory Days"
+ }
+ }
+ ]
+ }
+}
diff --git a/tests/data/valid/burntsushi/valid/table/array-implicit.toml b/tests/data/valid/burntsushi/valid/table/array-implicit.toml
new file mode 100644
index 0000000..3157ac9
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/table/array-implicit.toml
@@ -0,0 +1,2 @@
+[[albums.songs]]
+name = "Glory Days"
diff --git a/tests/data/valid/burntsushi/valid/table/array-many.json b/tests/data/valid/burntsushi/valid/table/array-many.json
new file mode 100644
index 0000000..fe78bf6
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/table/array-many.json
@@ -0,0 +1,34 @@
+{
+ "people": [
+ {
+ "first_name": {
+ "type": "string",
+ "value": "Bruce"
+ },
+ "last_name": {
+ "type": "string",
+ "value": "Springsteen"
+ }
+ },
+ {
+ "first_name": {
+ "type": "string",
+ "value": "Eric"
+ },
+ "last_name": {
+ "type": "string",
+ "value": "Clapton"
+ }
+ },
+ {
+ "first_name": {
+ "type": "string",
+ "value": "Bob"
+ },
+ "last_name": {
+ "type": "string",
+ "value": "Seger"
+ }
+ }
+ ]
+}
diff --git a/tests/data/valid/burntsushi/valid/table/array-many.toml b/tests/data/valid/burntsushi/valid/table/array-many.toml
new file mode 100644
index 0000000..46062be
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/table/array-many.toml
@@ -0,0 +1,11 @@
+[[people]]
+first_name = "Bruce"
+last_name = "Springsteen"
+
+[[people]]
+first_name = "Eric"
+last_name = "Clapton"
+
+[[people]]
+first_name = "Bob"
+last_name = "Seger"
diff --git a/tests/data/valid/burntsushi/valid/table/array-nest.json b/tests/data/valid/burntsushi/valid/table/array-nest.json
new file mode 100644
index 0000000..97f55c8
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/table/array-nest.json
@@ -0,0 +1,44 @@
+{
+ "albums": [
+ {
+ "name": {
+ "type": "string",
+ "value": "Born to Run"
+ },
+ "songs": [
+ {
+ "name": {
+ "type": "string",
+ "value": "Jungleland"
+ }
+ },
+ {
+ "name": {
+ "type": "string",
+ "value": "Meeting Across the River"
+ }
+ }
+ ]
+ },
+ {
+ "name": {
+ "type": "string",
+ "value": "Born in the USA"
+ },
+ "songs": [
+ {
+ "name": {
+ "type": "string",
+ "value": "Glory Days"
+ }
+ },
+ {
+ "name": {
+ "type": "string",
+ "value": "Dancing in the Dark"
+ }
+ }
+ ]
+ }
+ ]
+}
diff --git a/tests/data/valid/burntsushi/valid/table/array-nest.toml b/tests/data/valid/burntsushi/valid/table/array-nest.toml
new file mode 100644
index 0000000..d659a3d
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/table/array-nest.toml
@@ -0,0 +1,17 @@
+[[albums]]
+name = "Born to Run"
+
+ [[albums.songs]]
+ name = "Jungleland"
+
+ [[albums.songs]]
+ name = "Meeting Across the River"
+
+[[albums]]
+name = "Born in the USA"
+
+ [[albums.songs]]
+ name = "Glory Days"
+
+ [[albums.songs]]
+ name = "Dancing in the Dark"
diff --git a/tests/data/valid/burntsushi/valid/table/array-one.json b/tests/data/valid/burntsushi/valid/table/array-one.json
new file mode 100644
index 0000000..5cd67de
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/table/array-one.json
@@ -0,0 +1,14 @@
+{
+ "people": [
+ {
+ "first_name": {
+ "type": "string",
+ "value": "Bruce"
+ },
+ "last_name": {
+ "type": "string",
+ "value": "Springsteen"
+ }
+ }
+ ]
+}
diff --git a/tests/data/valid/burntsushi/valid/table/array-one.toml b/tests/data/valid/burntsushi/valid/table/array-one.toml
new file mode 100644
index 0000000..cd7e1b6
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/table/array-one.toml
@@ -0,0 +1,3 @@
+[[people]]
+first_name = "Bruce"
+last_name = "Springsteen"
diff --git a/tests/data/valid/burntsushi/valid/table/array-table-array.json b/tests/data/valid/burntsushi/valid/table/array-table-array.json
new file mode 100644
index 0000000..5c3d649
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/table/array-table-array.json
@@ -0,0 +1,24 @@
+{
+ "a": [
+ {
+ "b": [
+ {
+ "c": {
+ "d": {
+ "type": "string",
+ "value": "val0"
+ }
+ }
+ },
+ {
+ "c": {
+ "d": {
+ "type": "string",
+ "value": "val1"
+ }
+ }
+ }
+ ]
+ }
+ ]
+}
diff --git a/tests/data/valid/burntsushi/valid/table/array-table-array.toml b/tests/data/valid/burntsushi/valid/table/array-table-array.toml
new file mode 100644
index 0000000..a07b0c7
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/table/array-table-array.toml
@@ -0,0 +1,7 @@
+[[a]]
+ [[a.b]]
+ [a.b.c]
+ d = "val0"
+ [[a.b]]
+ [a.b.c]
+ d = "val1"
diff --git a/tests/data/valid/burntsushi/valid/table/empty.json b/tests/data/valid/burntsushi/valid/table/empty.json
new file mode 100644
index 0000000..3e82cda
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/table/empty.json
@@ -0,0 +1,3 @@
+{
+ "a": {}
+}
diff --git a/tests/data/valid/burntsushi/valid/table/empty.toml b/tests/data/valid/burntsushi/valid/table/empty.toml
new file mode 100644
index 0000000..8bb6a0a
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/table/empty.toml
@@ -0,0 +1 @@
+[a]
diff --git a/tests/data/valid/burntsushi/valid/table/keyword.json b/tests/data/valid/burntsushi/valid/table/keyword.json
new file mode 100644
index 0000000..a15dfae
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/table/keyword.json
@@ -0,0 +1,6 @@
+{
+ "true": {},
+ "false": {},
+ "inf": {},
+ "nan": {}
+}
diff --git a/tests/data/valid/burntsushi/valid/table/keyword.toml b/tests/data/valid/burntsushi/valid/table/keyword.toml
new file mode 100644
index 0000000..bc3d52a
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/table/keyword.toml
@@ -0,0 +1,9 @@
+[true]
+
+[false]
+
+[inf]
+
+[nan]
+
+
diff --git a/tests/data/valid/burntsushi/valid/table/names.json b/tests/data/valid/burntsushi/valid/table/names.json
new file mode 100644
index 0000000..66d8ea5
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/table/names.json
@@ -0,0 +1,30 @@
+{
+ "a": {
+ " x ": {},
+ "b": {
+ "c": {}
+ },
+ "b.c": {},
+ "d.e": {}
+ },
+ "d": {
+ "e": {
+ "f": {}
+ }
+ },
+ "g": {
+ "h": {
+ "i": {}
+ }
+ },
+ "j": {
+ "ʞ": {
+ "l": {}
+ }
+ },
+ "x": {
+ "1": {
+ "2": {}
+ }
+ }
+}
diff --git a/tests/data/valid/burntsushi/valid/table/names.toml b/tests/data/valid/burntsushi/valid/table/names.toml
new file mode 100644
index 0000000..092da2f
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/table/names.toml
@@ -0,0 +1,9 @@
+[a.b.c]
+[a."b.c"]
+[a.'d.e']
+[a.' x ']
+[ d.e.f ]
+[ g . h . i ]
+[ j . "ʞ" . 'l' ]
+
+[x.1.2]
diff --git a/tests/data/valid/burntsushi/valid/table/no-eol.json b/tests/data/valid/burntsushi/valid/table/no-eol.json
new file mode 100644
index 0000000..b6e7fb5
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/table/no-eol.json
@@ -0,0 +1,3 @@
+{
+ "table": {}
+}
diff --git a/tests/data/valid/burntsushi/valid/table/no-eol.toml b/tests/data/valid/burntsushi/valid/table/no-eol.toml
new file mode 100644
index 0000000..f1098fd
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/table/no-eol.toml
@@ -0,0 +1 @@
+[table]
diff --git a/tests/data/valid/burntsushi/valid/table/sub-empty.json b/tests/data/valid/burntsushi/valid/table/sub-empty.json
new file mode 100644
index 0000000..ed10cd2
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/table/sub-empty.json
@@ -0,0 +1,5 @@
+{
+ "a": {
+ "b": {}
+ }
+}
diff --git a/tests/data/valid/burntsushi/valid/table/sub-empty.toml b/tests/data/valid/burntsushi/valid/table/sub-empty.toml
new file mode 100644
index 0000000..70b7fe1
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/table/sub-empty.toml
@@ -0,0 +1,2 @@
+[a]
+[a.b]
diff --git a/tests/data/valid/burntsushi/valid/table/whitespace.json b/tests/data/valid/burntsushi/valid/table/whitespace.json
new file mode 100644
index 0000000..c770470
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/table/whitespace.json
@@ -0,0 +1,3 @@
+{
+ "valid key": {}
+}
diff --git a/tests/data/valid/burntsushi/valid/table/whitespace.toml b/tests/data/valid/burntsushi/valid/table/whitespace.toml
new file mode 100644
index 0000000..daf881d
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/table/whitespace.toml
@@ -0,0 +1 @@
+["valid key"]
diff --git a/tests/data/valid/burntsushi/valid/table/with-literal-string.json b/tests/data/valid/burntsushi/valid/table/with-literal-string.json
new file mode 100644
index 0000000..7784695
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/table/with-literal-string.json
@@ -0,0 +1,12 @@
+{
+ "a": {
+ "\"b\"": {
+ "c": {
+ "answer": {
+ "type": "integer",
+ "value": "42"
+ }
+ }
+ }
+ }
+}
diff --git a/tests/data/valid/burntsushi/valid/table/with-literal-string.toml b/tests/data/valid/burntsushi/valid/table/with-literal-string.toml
new file mode 100644
index 0000000..b81643d
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/table/with-literal-string.toml
@@ -0,0 +1,4 @@
+['a']
+[a.'"b"']
+[a.'"b"'.c]
+answer = 42
diff --git a/tests/data/valid/burntsushi/valid/table/with-pound.json b/tests/data/valid/burntsushi/valid/table/with-pound.json
new file mode 100644
index 0000000..f32d2f2
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/table/with-pound.json
@@ -0,0 +1,8 @@
+{
+ "key#group": {
+ "answer": {
+ "type": "integer",
+ "value": "42"
+ }
+ }
+}
diff --git a/tests/data/valid/burntsushi/valid/table/with-pound.toml b/tests/data/valid/burntsushi/valid/table/with-pound.toml
new file mode 100644
index 0000000..33f2c4f
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/table/with-pound.toml
@@ -0,0 +1,2 @@
+["key#group"]
+answer = 42
diff --git a/tests/data/valid/burntsushi/valid/table/with-single-quotes.json b/tests/data/valid/burntsushi/valid/table/with-single-quotes.json
new file mode 100644
index 0000000..347c693
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/table/with-single-quotes.json
@@ -0,0 +1,12 @@
+{
+ "a": {
+ "b": {
+ "c": {
+ "answer": {
+ "type": "integer",
+ "value": "42"
+ }
+ }
+ }
+ }
+}
diff --git a/tests/data/valid/burntsushi/valid/table/with-single-quotes.toml b/tests/data/valid/burntsushi/valid/table/with-single-quotes.toml
new file mode 100644
index 0000000..56e52cc
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/table/with-single-quotes.toml
@@ -0,0 +1,4 @@
+['a']
+[a.'b']
+[a.'b'.c]
+answer = 42
diff --git a/tests/data/valid/burntsushi/valid/table/without-super.json b/tests/data/valid/burntsushi/valid/table/without-super.json
new file mode 100644
index 0000000..3c390c6
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/table/without-super.json
@@ -0,0 +1,9 @@
+{
+ "x": {
+ "y": {
+ "z": {
+ "w": {}
+ }
+ }
+ }
+}
diff --git a/tests/data/valid/burntsushi/valid/table/without-super.toml b/tests/data/valid/burntsushi/valid/table/without-super.toml
new file mode 100644
index 0000000..73ed68b
--- /dev/null
+++ b/tests/data/valid/burntsushi/valid/table/without-super.toml
@@ -0,0 +1,5 @@
+# [x] you
+# [x.y] don't
+# [x.y.z] need these
+[x.y.z.w] # for this to work
+[x] # defining a super-table afterwards is ok
diff --git a/tests/data/valid/dates-and-times/datetimes.json b/tests/data/valid/dates-and-times/datetimes.json
new file mode 100644
index 0000000..99aca87
--- /dev/null
+++ b/tests/data/valid/dates-and-times/datetimes.json
@@ -0,0 +1,4 @@
+{
+ "local-dt": {"type":"datetime-local","value":"1988-10-27t01:01:01"},
+ "zulu-dt": {"type":"datetime","value":"1988-10-27t01:01:01z"}
+}
diff --git a/tests/data/valid/dates-and-times/datetimes.toml b/tests/data/valid/dates-and-times/datetimes.toml
new file mode 100644
index 0000000..cf84159
--- /dev/null
+++ b/tests/data/valid/dates-and-times/datetimes.toml
@@ -0,0 +1,2 @@
+local-dt=1988-10-27t01:01:01
+zulu-dt=1988-10-27t01:01:01z
diff --git a/tests/data/valid/dates-and-times/localtime.json b/tests/data/valid/dates-and-times/localtime.json
new file mode 100644
index 0000000..4d96abc
--- /dev/null
+++ b/tests/data/valid/dates-and-times/localtime.json
@@ -0,0 +1,2 @@
+{"t":
+ {"type":"time-local","value":"00:00:00.999999"}}
diff --git a/tests/data/valid/dates-and-times/localtime.toml b/tests/data/valid/dates-and-times/localtime.toml
new file mode 100644
index 0000000..87547c1
--- /dev/null
+++ b/tests/data/valid/dates-and-times/localtime.toml
@@ -0,0 +1 @@
+t=00:00:00.99999999999999 \ No newline at end of file
diff --git a/tests/data/valid/empty-inline-table.json b/tests/data/valid/empty-inline-table.json
new file mode 100644
index 0000000..2655cfd
--- /dev/null
+++ b/tests/data/valid/empty-inline-table.json
@@ -0,0 +1 @@
+{"empty": {}} \ No newline at end of file
diff --git a/tests/data/valid/empty-inline-table.toml b/tests/data/valid/empty-inline-table.toml
new file mode 100644
index 0000000..d2d15ab
--- /dev/null
+++ b/tests/data/valid/empty-inline-table.toml
@@ -0,0 +1 @@
+empty ={ }#nothing here
diff --git a/tests/data/valid/five-quotes.json b/tests/data/valid/five-quotes.json
new file mode 100644
index 0000000..5cc5274
--- /dev/null
+++ b/tests/data/valid/five-quotes.json
@@ -0,0 +1,4 @@
+{
+ "five-quotes": {"type":"string","value":"Closing with five quotes\n\"\""},
+ "four-quotes": {"type":"string","value":"Closing with four quotes\n\""}
+}
diff --git a/tests/data/valid/five-quotes.toml b/tests/data/valid/five-quotes.toml
new file mode 100644
index 0000000..ccc98c0
--- /dev/null
+++ b/tests/data/valid/five-quotes.toml
@@ -0,0 +1,6 @@
+five-quotes = """
+Closing with five quotes
+"""""
+four-quotes = """
+Closing with four quotes
+""""
diff --git a/tests/data/valid/hex-char.json b/tests/data/valid/hex-char.json
new file mode 100644
index 0000000..e632e20
--- /dev/null
+++ b/tests/data/valid/hex-char.json
@@ -0,0 +1,5 @@
+{
+ "a": {"type":"string","value":"a"},
+ "b": {"type":"string","value":"b"},
+ "c": {"type":"string","value":"c"}
+}
diff --git a/tests/data/valid/hex-char.toml b/tests/data/valid/hex-char.toml
new file mode 100644
index 0000000..1d9cdf6
--- /dev/null
+++ b/tests/data/valid/hex-char.toml
@@ -0,0 +1,3 @@
+a="\u0061"
+b="\u0062"
+c="\U00000063" \ No newline at end of file
diff --git a/tests/data/valid/multiline-basic-str/ends-in-whitespace-escape.json b/tests/data/valid/multiline-basic-str/ends-in-whitespace-escape.json
new file mode 100644
index 0000000..fc54a7c
--- /dev/null
+++ b/tests/data/valid/multiline-basic-str/ends-in-whitespace-escape.json
@@ -0,0 +1 @@
+{"beee": {"type": "string", "value": "heeee\ngeeee"}}
diff --git a/tests/data/valid/multiline-basic-str/ends-in-whitespace-escape.toml b/tests/data/valid/multiline-basic-str/ends-in-whitespace-escape.toml
new file mode 100644
index 0000000..4dffe55
--- /dev/null
+++ b/tests/data/valid/multiline-basic-str/ends-in-whitespace-escape.toml
@@ -0,0 +1,6 @@
+beee = """
+heeee
+geeee\
+
+
+ """
diff --git a/tests/data/valid/no-newlines.json b/tests/data/valid/no-newlines.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/tests/data/valid/no-newlines.json
@@ -0,0 +1 @@
+{}
diff --git a/tests/data/valid/no-newlines.toml b/tests/data/valid/no-newlines.toml
new file mode 100644
index 0000000..4b87f4c
--- /dev/null
+++ b/tests/data/valid/no-newlines.toml
@@ -0,0 +1 @@
+#no newlines at all here \ No newline at end of file
diff --git a/tests/data/valid/toml-lang-compliance/LICENSE b/tests/data/valid/toml-lang-compliance/LICENSE
new file mode 100644
index 0000000..cbcecb2
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/LICENSE
@@ -0,0 +1,23 @@
+The MIT License
+
+Copyright (c) 2021 Pradyun Gedam and Contributors
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+
+Portions of the Software include code copyright (c) Rebecca Turner.
diff --git a/tests/data/valid/toml-lang-compliance/README.md b/tests/data/valid/toml-lang-compliance/README.md
new file mode 100644
index 0000000..1c2f2e5
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/README.md
@@ -0,0 +1,6 @@
+These test cases are copied from
+https://github.com/pyrmont/toml-specs/tree/989fdfb02f6ca0a9e3b0a09b5e5f5283e02f1fa7
+
+There is an open PR (https://github.com/toml-lang/compliance/pull/8) to merge the tests into
+https://github.com/toml-lang/compliance
+after which we should sync the tests with that repository.
diff --git a/tests/data/valid/toml-lang-compliance/valid/array/spec-array-1.json b/tests/data/valid/toml-lang-compliance/valid/array/spec-array-1.json
new file mode 100644
index 0000000..8969c23
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/array/spec-array-1.json
@@ -0,0 +1,5 @@
+{"integers":
+ {"type":"array","value":[
+ {"type":"integer","value":"1"},
+ {"type":"integer","value":"2"},
+ {"type":"integer","value":"3"}]}}
diff --git a/tests/data/valid/toml-lang-compliance/valid/array/spec-array-1.toml b/tests/data/valid/toml-lang-compliance/valid/array/spec-array-1.toml
new file mode 100644
index 0000000..c920407
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/array/spec-array-1.toml
@@ -0,0 +1 @@
+integers = [ 1, 2, 3 ]
diff --git a/tests/data/valid/toml-lang-compliance/valid/array/spec-array-2.json b/tests/data/valid/toml-lang-compliance/valid/array/spec-array-2.json
new file mode 100644
index 0000000..aaeceaa
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/array/spec-array-2.json
@@ -0,0 +1,5 @@
+{"colors":
+ {"type":"array","value":[
+ {"type":"string","value":"red"},
+ {"type":"string","value":"yellow"},
+ {"type":"string","value":"green"}]}}
diff --git a/tests/data/valid/toml-lang-compliance/valid/array/spec-array-2.toml b/tests/data/valid/toml-lang-compliance/valid/array/spec-array-2.toml
new file mode 100644
index 0000000..a6ab64d
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/array/spec-array-2.toml
@@ -0,0 +1 @@
+colors = [ "red", "yellow", "green" ]
diff --git a/tests/data/valid/toml-lang-compliance/valid/array/spec-array-3.json b/tests/data/valid/toml-lang-compliance/valid/array/spec-array-3.json
new file mode 100644
index 0000000..0c1af39
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/array/spec-array-3.json
@@ -0,0 +1,9 @@
+{"nested_array_of_int":
+ {"type":"array","value":[
+ {"type":"array","value":[
+ {"type":"integer","value":"1"},
+ {"type":"integer","value":"2"}]},
+ {"type":"array","value":[
+ {"type":"integer","value":"3"},
+ {"type":"integer","value":"4"},
+ {"type":"integer","value":"5"}]}]}}
diff --git a/tests/data/valid/toml-lang-compliance/valid/array/spec-array-3.toml b/tests/data/valid/toml-lang-compliance/valid/array/spec-array-3.toml
new file mode 100644
index 0000000..8ac49b5
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/array/spec-array-3.toml
@@ -0,0 +1 @@
+nested_array_of_int = [ [ 1, 2 ], [3, 4, 5] ]
diff --git a/tests/data/valid/toml-lang-compliance/valid/array/spec-array-4.json b/tests/data/valid/toml-lang-compliance/valid/array/spec-array-4.json
new file mode 100644
index 0000000..bc5caa9
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/array/spec-array-4.json
@@ -0,0 +1,6 @@
+{"string_array":
+ {"type":"array","value":[
+ {"type":"string","value":"all"},
+ {"type":"string","value":"strings"},
+ {"type":"string","value":"are the same"},
+ {"type":"string","value":"type"}]}}
diff --git a/tests/data/valid/toml-lang-compliance/valid/array/spec-array-4.toml b/tests/data/valid/toml-lang-compliance/valid/array/spec-array-4.toml
new file mode 100644
index 0000000..51894ce
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/array/spec-array-4.toml
@@ -0,0 +1 @@
+string_array = [ "all", 'strings', """are the same""", '''type''']
diff --git a/tests/data/valid/toml-lang-compliance/valid/array/spec-array-5.json b/tests/data/valid/toml-lang-compliance/valid/array/spec-array-5.json
new file mode 100644
index 0000000..2facade
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/array/spec-array-5.json
@@ -0,0 +1,9 @@
+{"nested_mixed_array":
+ {"type":"array","value":[
+ {"type":"array","value":[
+ {"type":"integer","value":"1"},
+ {"type":"integer","value":"2"}]},
+ {"type":"array","value":[
+ {"type":"string","value":"a"},
+ {"type":"string","value":"b"},
+ {"type":"string","value":"c"}]}]}}
diff --git a/tests/data/valid/toml-lang-compliance/valid/array/spec-array-5.toml b/tests/data/valid/toml-lang-compliance/valid/array/spec-array-5.toml
new file mode 100644
index 0000000..86c4179
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/array/spec-array-5.toml
@@ -0,0 +1 @@
+nested_mixed_array = [ [ 1, 2 ], ["a", "b", "c"] ]
diff --git a/tests/data/valid/toml-lang-compliance/valid/array/spec-array-7.json b/tests/data/valid/toml-lang-compliance/valid/array/spec-array-7.json
new file mode 100644
index 0000000..1200f99
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/array/spec-array-7.json
@@ -0,0 +1,5 @@
+{"integers2":
+ {"type":"array","value":[
+ {"type":"integer","value":"1"},
+ {"type":"integer","value":"2"},
+ {"type":"integer","value":"3"}]}}
diff --git a/tests/data/valid/toml-lang-compliance/valid/array/spec-array-7.toml b/tests/data/valid/toml-lang-compliance/valid/array/spec-array-7.toml
new file mode 100644
index 0000000..1a20ef6
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/array/spec-array-7.toml
@@ -0,0 +1,3 @@
+integers2 = [
+ 1, 2, 3
+]
diff --git a/tests/data/valid/toml-lang-compliance/valid/array/spec-array-8.json b/tests/data/valid/toml-lang-compliance/valid/array/spec-array-8.json
new file mode 100644
index 0000000..018cb0f
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/array/spec-array-8.json
@@ -0,0 +1,4 @@
+{"integers3":
+ {"type":"array","value":[
+ {"type":"integer","value":"1"},
+ {"type":"integer","value":"2"}]}}
diff --git a/tests/data/valid/toml-lang-compliance/valid/array/spec-array-8.toml b/tests/data/valid/toml-lang-compliance/valid/array/spec-array-8.toml
new file mode 100644
index 0000000..963a908
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/array/spec-array-8.toml
@@ -0,0 +1,4 @@
+integers3 = [
+ 1,
+ 2, # this is ok
+]
diff --git a/tests/data/valid/toml-lang-compliance/valid/array/spec-array-mixed-number-types.json b/tests/data/valid/toml-lang-compliance/valid/array/spec-array-mixed-number-types.json
new file mode 100644
index 0000000..cf8bf9e
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/array/spec-array-mixed-number-types.json
@@ -0,0 +1,8 @@
+{"numbers":
+ {"type":"array","value":[
+ {"type":"float","value":"0.1"},
+ {"type":"float","value":"0.2"},
+ {"type":"float","value":"0.5"},
+ {"type":"integer","value":"1"},
+ {"type":"integer","value":"2"},
+ {"type":"integer","value":"5"}]}}
diff --git a/tests/data/valid/toml-lang-compliance/valid/array/spec-array-mixed-number-types.toml b/tests/data/valid/toml-lang-compliance/valid/array/spec-array-mixed-number-types.toml
new file mode 100644
index 0000000..257864f
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/array/spec-array-mixed-number-types.toml
@@ -0,0 +1 @@
+numbers = [ 0.1, 0.2, 0.5, 1, 2, 5 ]
diff --git a/tests/data/valid/toml-lang-compliance/valid/array/spec-array-more-mixed-types.json b/tests/data/valid/toml-lang-compliance/valid/array/spec-array-more-mixed-types.json
new file mode 100644
index 0000000..1b6d9f6
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/array/spec-array-more-mixed-types.json
@@ -0,0 +1,9 @@
+{"contributors":
+ {"type":"array","value":[
+ {"type":"string","value":"Foo Bar <foo@example.com>"},
+ {"name":
+ {"type":"string","value":"Baz Qux"},
+ "email":
+ {"type":"string","value":"bazqux@example.com"},
+ "url":
+ {"type":"string", "value":"https://example.com/bazqux"}}]}}
diff --git a/tests/data/valid/toml-lang-compliance/valid/array/spec-array-more-mixed-types.toml b/tests/data/valid/toml-lang-compliance/valid/array/spec-array-more-mixed-types.toml
new file mode 100644
index 0000000..bd7ada8
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/array/spec-array-more-mixed-types.toml
@@ -0,0 +1,4 @@
+contributors = [
+ "Foo Bar <foo@example.com>",
+ { name = "Baz Qux", email = "bazqux@example.com", url = "https://example.com/bazqux" }
+]
diff --git a/tests/data/valid/toml-lang-compliance/valid/array/spec-array-of-tables-1.json b/tests/data/valid/toml-lang-compliance/valid/array/spec-array-of-tables-1.json
new file mode 100644
index 0000000..e9353b6
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/array/spec-array-of-tables-1.json
@@ -0,0 +1,13 @@
+{"products":
+ {"type":"array","value":[
+ {"name":
+ {"type":"string","value":"Hammer"},
+ "sku":
+ {"type":"integer","value":"738594937"}},
+ {},
+ {"name":
+ {"type":"string","value":"Nail"},
+ "sku":
+ {"type":"integer","value":"284758393"},
+ "color":
+ {"type":"string","value":"gray"}}]}}
diff --git a/tests/data/valid/toml-lang-compliance/valid/array/spec-array-of-tables-1.toml b/tests/data/valid/toml-lang-compliance/valid/array/spec-array-of-tables-1.toml
new file mode 100644
index 0000000..ac3883b
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/array/spec-array-of-tables-1.toml
@@ -0,0 +1,10 @@
+[[products]]
+name = "Hammer"
+sku = 738594937
+
+[[products]]
+
+[[products]]
+name = "Nail"
+sku = 284758393
+color = "gray"
diff --git a/tests/data/valid/toml-lang-compliance/valid/array/spec-array-of-tables-2.json b/tests/data/valid/toml-lang-compliance/valid/array/spec-array-of-tables-2.json
new file mode 100644
index 0000000..1eda5f6
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/array/spec-array-of-tables-2.json
@@ -0,0 +1,21 @@
+{"fruit":
+ {"type":"array","value":[
+ {"name":
+ {"type":"string","value":"apple"},
+ "physical":
+ {"color":
+ {"type":"string","value":"red"},
+ "shape":
+ {"type":"string","value":"round"}},
+ "variety":
+ {"type":"array","value":[
+ {"name":
+ {"type":"string","value":"red delicious"}},
+ {"name":
+ {"type":"string","value":"granny smith"}}]}},
+ {"name":
+ {"type":"string","value":"banana"},
+ "variety":
+ {"type":"array","value":[
+ {"name":
+ {"type":"string","value":"plantain"}}]}}]}}
diff --git a/tests/data/valid/toml-lang-compliance/valid/array/spec-array-of-tables-2.toml b/tests/data/valid/toml-lang-compliance/valid/array/spec-array-of-tables-2.toml
new file mode 100644
index 0000000..ced9e2a
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/array/spec-array-of-tables-2.toml
@@ -0,0 +1,18 @@
+[[fruit]]
+ name = "apple"
+
+ [fruit.physical]
+ color = "red"
+ shape = "round"
+
+ [[fruit.variety]]
+ name = "red delicious"
+
+ [[fruit.variety]]
+ name = "granny smith"
+
+[[fruit]]
+ name = "banana"
+
+ [[fruit.variety]]
+ name = "plantain"
diff --git a/tests/data/valid/toml-lang-compliance/valid/array/spec-array-of-tables-3.json b/tests/data/valid/toml-lang-compliance/valid/array/spec-array-of-tables-3.json
new file mode 100644
index 0000000..4bc1820
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/array/spec-array-of-tables-3.json
@@ -0,0 +1,20 @@
+{"points":
+ {"type":"array","value":[
+ {"x":
+ {"type":"integer","value":"1"},
+ "y":
+ {"type":"integer","value":"2"},
+ "z":
+ {"type":"integer","value":"3"}},
+ {"x":
+ {"type":"integer","value":"7"},
+ "y":
+ {"type":"integer","value":"8"},
+ "z":
+ {"type":"integer","value":"9"}},
+ {"x":
+ {"type":"integer","value":"2"},
+ "y":
+ {"type":"integer","value":"4"},
+ "z":
+ {"type":"integer","value":"8"}}]}}
diff --git a/tests/data/valid/toml-lang-compliance/valid/array/spec-array-of-tables-3.toml b/tests/data/valid/toml-lang-compliance/valid/array/spec-array-of-tables-3.toml
new file mode 100644
index 0000000..ba5584a
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/array/spec-array-of-tables-3.toml
@@ -0,0 +1,3 @@
+points = [ { x = 1, y = 2, z = 3 },
+ { x = 7, y = 8, z = 9 },
+ { x = 2, y = 4, z = 8 } ]
diff --git a/tests/data/valid/toml-lang-compliance/valid/boolean/spec-boolean-1.json b/tests/data/valid/toml-lang-compliance/valid/boolean/spec-boolean-1.json
new file mode 100644
index 0000000..fcf3f11
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/boolean/spec-boolean-1.json
@@ -0,0 +1,2 @@
+{"bool1":
+ {"type":"boolean","value":"true"}}
diff --git a/tests/data/valid/toml-lang-compliance/valid/boolean/spec-boolean-1.toml b/tests/data/valid/toml-lang-compliance/valid/boolean/spec-boolean-1.toml
new file mode 100644
index 0000000..67652cb
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/boolean/spec-boolean-1.toml
@@ -0,0 +1 @@
+bool1 = true
diff --git a/tests/data/valid/toml-lang-compliance/valid/boolean/spec-boolean-2.json b/tests/data/valid/toml-lang-compliance/valid/boolean/spec-boolean-2.json
new file mode 100644
index 0000000..526069a
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/boolean/spec-boolean-2.json
@@ -0,0 +1,2 @@
+{"bool1":
+ {"type":"boolean","value":"false"}}
diff --git a/tests/data/valid/toml-lang-compliance/valid/boolean/spec-boolean-2.toml b/tests/data/valid/toml-lang-compliance/valid/boolean/spec-boolean-2.toml
new file mode 100644
index 0000000..da78c67
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/boolean/spec-boolean-2.toml
@@ -0,0 +1 @@
+bool1 = false
diff --git a/tests/data/valid/toml-lang-compliance/valid/comment/spec-comment-mid-array.json b/tests/data/valid/toml-lang-compliance/valid/comment/spec-comment-mid-array.json
new file mode 100644
index 0000000..3bf2b01
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/comment/spec-comment-mid-array.json
@@ -0,0 +1,4 @@
+{"abc":
+ {"type":"array","value":[
+ {"type":"integer","value":"123"},
+ {"type":"integer","value":"456"}]}}
diff --git a/tests/data/valid/toml-lang-compliance/valid/comment/spec-comment-mid-array.toml b/tests/data/valid/toml-lang-compliance/valid/comment/spec-comment-mid-array.toml
new file mode 100644
index 0000000..c87dd18
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/comment/spec-comment-mid-array.toml
@@ -0,0 +1,6 @@
+# eol commetns can go anywhere
+abc = [ # this is valid
+ 123,#as is this
+ 456 #so is this
+ ]# and this
+# here too
diff --git a/tests/data/valid/toml-lang-compliance/valid/comment/spec-comment-mid-string.json b/tests/data/valid/toml-lang-compliance/valid/comment/spec-comment-mid-string.json
new file mode 100644
index 0000000..53d143a
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/comment/spec-comment-mid-string.json
@@ -0,0 +1,2 @@
+{"another":
+ {"type":"string","value":"# This is not a comment"}}
diff --git a/tests/data/valid/toml-lang-compliance/valid/comment/spec-comment-mid-string.toml b/tests/data/valid/toml-lang-compliance/valid/comment/spec-comment-mid-string.toml
new file mode 100644
index 0000000..9df443b
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/comment/spec-comment-mid-string.toml
@@ -0,0 +1 @@
+another = "# This is not a comment"
diff --git a/tests/data/valid/toml-lang-compliance/valid/comment/spec-comment-tab.json b/tests/data/valid/toml-lang-compliance/valid/comment/spec-comment-tab.json
new file mode 100644
index 0000000..042895f
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/comment/spec-comment-tab.json
@@ -0,0 +1,2 @@
+{"key":
+ {"type":"string","value":"value"}}
diff --git a/tests/data/valid/toml-lang-compliance/valid/comment/spec-comment-tab.toml b/tests/data/valid/toml-lang-compliance/valid/comment/spec-comment-tab.toml
new file mode 100644
index 0000000..5f5f616
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/comment/spec-comment-tab.toml
@@ -0,0 +1,2 @@
+# This is a full-line comment with a tab in the middle
+key = "value" # This is a commen with a tab in the middle at the end of a line
diff --git a/tests/data/valid/toml-lang-compliance/valid/comment/spec-comment.json b/tests/data/valid/toml-lang-compliance/valid/comment/spec-comment.json
new file mode 100644
index 0000000..042895f
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/comment/spec-comment.json
@@ -0,0 +1,2 @@
+{"key":
+ {"type":"string","value":"value"}}
diff --git a/tests/data/valid/toml-lang-compliance/valid/comment/spec-comment.toml b/tests/data/valid/toml-lang-compliance/valid/comment/spec-comment.toml
new file mode 100644
index 0000000..090b474
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/comment/spec-comment.toml
@@ -0,0 +1,2 @@
+# This is a full-line comment
+key = "value" # This is a comment at the end of a line
diff --git a/tests/data/valid/toml-lang-compliance/valid/date-time/spec-date-local-1.json b/tests/data/valid/toml-lang-compliance/valid/date-time/spec-date-local-1.json
new file mode 100644
index 0000000..b0d7680
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/date-time/spec-date-local-1.json
@@ -0,0 +1,2 @@
+{"ld1":
+ {"type":"local date","value":"1979-05-27"}}
diff --git a/tests/data/valid/toml-lang-compliance/valid/date-time/spec-date-local-1.toml b/tests/data/valid/toml-lang-compliance/valid/date-time/spec-date-local-1.toml
new file mode 100644
index 0000000..6670e5d
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/date-time/spec-date-local-1.toml
@@ -0,0 +1 @@
+ld1 = 1979-05-27
diff --git a/tests/data/valid/toml-lang-compliance/valid/date-time/spec-date-time-1.json b/tests/data/valid/toml-lang-compliance/valid/date-time/spec-date-time-1.json
new file mode 100644
index 0000000..d967761
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/date-time/spec-date-time-1.json
@@ -0,0 +1,2 @@
+{"odt1":
+ {"type":"offset datetime","value":"1979-05-27T07:32:00Z"}}
diff --git a/tests/data/valid/toml-lang-compliance/valid/date-time/spec-date-time-1.toml b/tests/data/valid/toml-lang-compliance/valid/date-time/spec-date-time-1.toml
new file mode 100644
index 0000000..5f5f16f
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/date-time/spec-date-time-1.toml
@@ -0,0 +1 @@
+odt1 = 1979-05-27T07:32:00Z
diff --git a/tests/data/valid/toml-lang-compliance/valid/date-time/spec-date-time-2.json b/tests/data/valid/toml-lang-compliance/valid/date-time/spec-date-time-2.json
new file mode 100644
index 0000000..bbc1b1d
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/date-time/spec-date-time-2.json
@@ -0,0 +1,2 @@
+{"odt2":
+ {"type":"offset datetime","value":"1979-05-27T00:32:00-07:00"}}
diff --git a/tests/data/valid/toml-lang-compliance/valid/date-time/spec-date-time-2.toml b/tests/data/valid/toml-lang-compliance/valid/date-time/spec-date-time-2.toml
new file mode 100644
index 0000000..0041355
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/date-time/spec-date-time-2.toml
@@ -0,0 +1 @@
+odt2 = 1979-05-27T00:32:00-07:00
diff --git a/tests/data/valid/toml-lang-compliance/valid/date-time/spec-date-time-3.json b/tests/data/valid/toml-lang-compliance/valid/date-time/spec-date-time-3.json
new file mode 100644
index 0000000..193dbcd
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/date-time/spec-date-time-3.json
@@ -0,0 +1,2 @@
+{"odt3":
+ {"type":"offset datetime","value":"1979-05-27T00:32:00.999999-07:00"}}
diff --git a/tests/data/valid/toml-lang-compliance/valid/date-time/spec-date-time-3.toml b/tests/data/valid/toml-lang-compliance/valid/date-time/spec-date-time-3.toml
new file mode 100644
index 0000000..78bb2dc
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/date-time/spec-date-time-3.toml
@@ -0,0 +1 @@
+odt3 = 1979-05-27T00:32:00.999999-07:00
diff --git a/tests/data/valid/toml-lang-compliance/valid/date-time/spec-date-time-4.json b/tests/data/valid/toml-lang-compliance/valid/date-time/spec-date-time-4.json
new file mode 100644
index 0000000..e45a286
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/date-time/spec-date-time-4.json
@@ -0,0 +1,2 @@
+{"odt4":
+ {"type":"offset datetime","value":"1979-05-27T07:32:00Z"}}
diff --git a/tests/data/valid/toml-lang-compliance/valid/date-time/spec-date-time-4.toml b/tests/data/valid/toml-lang-compliance/valid/date-time/spec-date-time-4.toml
new file mode 100644
index 0000000..da9bd3b
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/date-time/spec-date-time-4.toml
@@ -0,0 +1 @@
+odt4 = 1979-05-27 07:32:00Z
diff --git a/tests/data/valid/toml-lang-compliance/valid/date-time/spec-date-time-5.json b/tests/data/valid/toml-lang-compliance/valid/date-time/spec-date-time-5.json
new file mode 100644
index 0000000..cb81ecd
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/date-time/spec-date-time-5.json
@@ -0,0 +1,2 @@
+{"odt5":
+ {"type":"offset datetime","value":"1979-05-27T07:32:00.123Z"}}
diff --git a/tests/data/valid/toml-lang-compliance/valid/date-time/spec-date-time-5.toml b/tests/data/valid/toml-lang-compliance/valid/date-time/spec-date-time-5.toml
new file mode 100644
index 0000000..3ff0f9f
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/date-time/spec-date-time-5.toml
@@ -0,0 +1 @@
+odt5 = 1979-05-27T07:32:00.123Z
diff --git a/tests/data/valid/toml-lang-compliance/valid/date-time/spec-date-time-6.json b/tests/data/valid/toml-lang-compliance/valid/date-time/spec-date-time-6.json
new file mode 100644
index 0000000..9964a8d
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/date-time/spec-date-time-6.json
@@ -0,0 +1,2 @@
+{"odt6":
+ {"type":"offset datetime","value":"1979-05-27T07:32:00.1239Z"}}
diff --git a/tests/data/valid/toml-lang-compliance/valid/date-time/spec-date-time-6.toml b/tests/data/valid/toml-lang-compliance/valid/date-time/spec-date-time-6.toml
new file mode 100644
index 0000000..f05adbf
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/date-time/spec-date-time-6.toml
@@ -0,0 +1 @@
+odt6 = 1979-05-27T07:32:00.1239Z
diff --git a/tests/data/valid/toml-lang-compliance/valid/date-time/spec-date-time-local-1.json b/tests/data/valid/toml-lang-compliance/valid/date-time/spec-date-time-local-1.json
new file mode 100644
index 0000000..2870800
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/date-time/spec-date-time-local-1.json
@@ -0,0 +1,2 @@
+{"ldt1":
+ {"type":"local datetime","value":"1979-05-27T07:32:00"}}
diff --git a/tests/data/valid/toml-lang-compliance/valid/date-time/spec-date-time-local-1.toml b/tests/data/valid/toml-lang-compliance/valid/date-time/spec-date-time-local-1.toml
new file mode 100644
index 0000000..42dcb27
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/date-time/spec-date-time-local-1.toml
@@ -0,0 +1 @@
+ldt1 = 1979-05-27T07:32:00
diff --git a/tests/data/valid/toml-lang-compliance/valid/date-time/spec-date-time-local-2.json b/tests/data/valid/toml-lang-compliance/valid/date-time/spec-date-time-local-2.json
new file mode 100644
index 0000000..01dd881
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/date-time/spec-date-time-local-2.json
@@ -0,0 +1,2 @@
+{"ldt2":
+ {"type":"local datetime","value":"1979-05-27T00:32:00.999999"}}
diff --git a/tests/data/valid/toml-lang-compliance/valid/date-time/spec-date-time-local-2.toml b/tests/data/valid/toml-lang-compliance/valid/date-time/spec-date-time-local-2.toml
new file mode 100644
index 0000000..bf4a61c
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/date-time/spec-date-time-local-2.toml
@@ -0,0 +1 @@
+ldt2 = 1979-05-27T00:32:00.999999
diff --git a/tests/data/valid/toml-lang-compliance/valid/date-time/spec-time-1.json b/tests/data/valid/toml-lang-compliance/valid/date-time/spec-time-1.json
new file mode 100644
index 0000000..4286be0
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/date-time/spec-time-1.json
@@ -0,0 +1,2 @@
+{"lt1":
+ {"type":"local time","value":"07:32:00"}}
diff --git a/tests/data/valid/toml-lang-compliance/valid/date-time/spec-time-1.toml b/tests/data/valid/toml-lang-compliance/valid/date-time/spec-time-1.toml
new file mode 100644
index 0000000..ad61916
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/date-time/spec-time-1.toml
@@ -0,0 +1 @@
+lt1 = 07:32:00
diff --git a/tests/data/valid/toml-lang-compliance/valid/date-time/spec-time-2.json b/tests/data/valid/toml-lang-compliance/valid/date-time/spec-time-2.json
new file mode 100644
index 0000000..ddd1a06
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/date-time/spec-time-2.json
@@ -0,0 +1,2 @@
+{"lt2":
+ {"type":"local time","value":"00:32:00.999999"}}
diff --git a/tests/data/valid/toml-lang-compliance/valid/date-time/spec-time-2.toml b/tests/data/valid/toml-lang-compliance/valid/date-time/spec-time-2.toml
new file mode 100644
index 0000000..8e1ffb1
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/date-time/spec-time-2.toml
@@ -0,0 +1 @@
+lt2 = 00:32:00.999999
diff --git a/tests/data/valid/toml-lang-compliance/valid/float/spec-float-1.json b/tests/data/valid/toml-lang-compliance/valid/float/spec-float-1.json
new file mode 100644
index 0000000..80603c3
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/float/spec-float-1.json
@@ -0,0 +1,2 @@
+{"flt1":
+ {"type":"float","value":"1"}}
diff --git a/tests/data/valid/toml-lang-compliance/valid/float/spec-float-1.toml b/tests/data/valid/toml-lang-compliance/valid/float/spec-float-1.toml
new file mode 100644
index 0000000..8da5cef
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/float/spec-float-1.toml
@@ -0,0 +1 @@
+flt1 = +1.0
diff --git a/tests/data/valid/toml-lang-compliance/valid/float/spec-float-10.json b/tests/data/valid/toml-lang-compliance/valid/float/spec-float-10.json
new file mode 100644
index 0000000..2466b94
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/float/spec-float-10.json
@@ -0,0 +1,2 @@
+{"sf1":
+ {"type":"float","value":"inf"}}
diff --git a/tests/data/valid/toml-lang-compliance/valid/float/spec-float-10.toml b/tests/data/valid/toml-lang-compliance/valid/float/spec-float-10.toml
new file mode 100644
index 0000000..921d3d8
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/float/spec-float-10.toml
@@ -0,0 +1 @@
+sf1 = inf # positive infinity
diff --git a/tests/data/valid/toml-lang-compliance/valid/float/spec-float-11.json b/tests/data/valid/toml-lang-compliance/valid/float/spec-float-11.json
new file mode 100644
index 0000000..6f8c295
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/float/spec-float-11.json
@@ -0,0 +1,2 @@
+{"sf2":
+ {"type":"float","value":"inf"}}
diff --git a/tests/data/valid/toml-lang-compliance/valid/float/spec-float-11.toml b/tests/data/valid/toml-lang-compliance/valid/float/spec-float-11.toml
new file mode 100644
index 0000000..a0d60b8
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/float/spec-float-11.toml
@@ -0,0 +1 @@
+sf2 = +inf # positive infinity
diff --git a/tests/data/valid/toml-lang-compliance/valid/float/spec-float-12.json b/tests/data/valid/toml-lang-compliance/valid/float/spec-float-12.json
new file mode 100644
index 0000000..dfa6e14
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/float/spec-float-12.json
@@ -0,0 +1,2 @@
+{"sf3":
+ {"type":"float","value":"-inf"}}
diff --git a/tests/data/valid/toml-lang-compliance/valid/float/spec-float-12.toml b/tests/data/valid/toml-lang-compliance/valid/float/spec-float-12.toml
new file mode 100644
index 0000000..7666b87
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/float/spec-float-12.toml
@@ -0,0 +1 @@
+sf3 = -inf # negative infinity
diff --git a/tests/data/valid/toml-lang-compliance/valid/float/spec-float-13.json b/tests/data/valid/toml-lang-compliance/valid/float/spec-float-13.json
new file mode 100644
index 0000000..4b1ea24
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/float/spec-float-13.json
@@ -0,0 +1,2 @@
+{"sf4":
+ {"type":"float","value":"nan"}}
diff --git a/tests/data/valid/toml-lang-compliance/valid/float/spec-float-13.toml b/tests/data/valid/toml-lang-compliance/valid/float/spec-float-13.toml
new file mode 100644
index 0000000..211cc25
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/float/spec-float-13.toml
@@ -0,0 +1 @@
+sf4 = nan # actual sNaN/qNaN encoding is implementation specific
diff --git a/tests/data/valid/toml-lang-compliance/valid/float/spec-float-14.json b/tests/data/valid/toml-lang-compliance/valid/float/spec-float-14.json
new file mode 100644
index 0000000..b950f8d
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/float/spec-float-14.json
@@ -0,0 +1,2 @@
+{"sf5":
+ {"type":"float","value":"nan"}}
diff --git a/tests/data/valid/toml-lang-compliance/valid/float/spec-float-14.toml b/tests/data/valid/toml-lang-compliance/valid/float/spec-float-14.toml
new file mode 100644
index 0000000..bc22a27
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/float/spec-float-14.toml
@@ -0,0 +1 @@
+sf5 = +nan # same as `nan`
diff --git a/tests/data/valid/toml-lang-compliance/valid/float/spec-float-15.json b/tests/data/valid/toml-lang-compliance/valid/float/spec-float-15.json
new file mode 100644
index 0000000..e422aff
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/float/spec-float-15.json
@@ -0,0 +1,2 @@
+{"sf6":
+ {"type":"float","value":"nan"}}
diff --git a/tests/data/valid/toml-lang-compliance/valid/float/spec-float-15.toml b/tests/data/valid/toml-lang-compliance/valid/float/spec-float-15.toml
new file mode 100644
index 0000000..a51c85c
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/float/spec-float-15.toml
@@ -0,0 +1 @@
+sf6 = -nan # valid, actual encoding is implementation specific
diff --git a/tests/data/valid/toml-lang-compliance/valid/float/spec-float-2.json b/tests/data/valid/toml-lang-compliance/valid/float/spec-float-2.json
new file mode 100644
index 0000000..22a67d9
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/float/spec-float-2.json
@@ -0,0 +1,2 @@
+{"flt2":
+ {"type":"float","value":"3.1415"}}
diff --git a/tests/data/valid/toml-lang-compliance/valid/float/spec-float-2.toml b/tests/data/valid/toml-lang-compliance/valid/float/spec-float-2.toml
new file mode 100644
index 0000000..61b0f38
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/float/spec-float-2.toml
@@ -0,0 +1 @@
+flt2 = 3.1415
diff --git a/tests/data/valid/toml-lang-compliance/valid/float/spec-float-3.json b/tests/data/valid/toml-lang-compliance/valid/float/spec-float-3.json
new file mode 100644
index 0000000..42cd4d7
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/float/spec-float-3.json
@@ -0,0 +1,2 @@
+{"flt3":
+ {"type":"float","value":"-0.01"}}
diff --git a/tests/data/valid/toml-lang-compliance/valid/float/spec-float-3.toml b/tests/data/valid/toml-lang-compliance/valid/float/spec-float-3.toml
new file mode 100644
index 0000000..3a83cc1
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/float/spec-float-3.toml
@@ -0,0 +1 @@
+flt3 = -0.01
diff --git a/tests/data/valid/toml-lang-compliance/valid/float/spec-float-4.json b/tests/data/valid/toml-lang-compliance/valid/float/spec-float-4.json
new file mode 100644
index 0000000..892c276
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/float/spec-float-4.json
@@ -0,0 +1,2 @@
+{"flt4":
+ {"type":"float","value":"5e+22"}}
diff --git a/tests/data/valid/toml-lang-compliance/valid/float/spec-float-4.toml b/tests/data/valid/toml-lang-compliance/valid/float/spec-float-4.toml
new file mode 100644
index 0000000..1778616
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/float/spec-float-4.toml
@@ -0,0 +1 @@
+flt4 = 5e+22
diff --git a/tests/data/valid/toml-lang-compliance/valid/float/spec-float-5.json b/tests/data/valid/toml-lang-compliance/valid/float/spec-float-5.json
new file mode 100644
index 0000000..60053e9
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/float/spec-float-5.json
@@ -0,0 +1,2 @@
+{"flt5":
+ {"type":"float","value":"1000000"}}
diff --git a/tests/data/valid/toml-lang-compliance/valid/float/spec-float-5.toml b/tests/data/valid/toml-lang-compliance/valid/float/spec-float-5.toml
new file mode 100644
index 0000000..1ac9eaf
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/float/spec-float-5.toml
@@ -0,0 +1 @@
+flt5 = 1e06
diff --git a/tests/data/valid/toml-lang-compliance/valid/float/spec-float-6.json b/tests/data/valid/toml-lang-compliance/valid/float/spec-float-6.json
new file mode 100644
index 0000000..a34c148
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/float/spec-float-6.json
@@ -0,0 +1,2 @@
+{"flt6":
+ {"type":"float","value":"-0.02"}}
diff --git a/tests/data/valid/toml-lang-compliance/valid/float/spec-float-6.toml b/tests/data/valid/toml-lang-compliance/valid/float/spec-float-6.toml
new file mode 100644
index 0000000..5bfa47f
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/float/spec-float-6.toml
@@ -0,0 +1 @@
+flt6 = -2E-2
diff --git a/tests/data/valid/toml-lang-compliance/valid/float/spec-float-7.json b/tests/data/valid/toml-lang-compliance/valid/float/spec-float-7.json
new file mode 100644
index 0000000..5138b0e
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/float/spec-float-7.json
@@ -0,0 +1,2 @@
+{"flt7":
+ {"type":"float","value":"6.626e-34"}}
diff --git a/tests/data/valid/toml-lang-compliance/valid/float/spec-float-7.toml b/tests/data/valid/toml-lang-compliance/valid/float/spec-float-7.toml
new file mode 100644
index 0000000..15b43b1
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/float/spec-float-7.toml
@@ -0,0 +1 @@
+flt7 = 6.626e-34
diff --git a/tests/data/valid/toml-lang-compliance/valid/float/spec-float-8.json b/tests/data/valid/toml-lang-compliance/valid/float/spec-float-8.json
new file mode 100644
index 0000000..1757a9c
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/float/spec-float-8.json
@@ -0,0 +1,2 @@
+{"flt8":
+ {"type":"float","value":"224617.445991228"}}
diff --git a/tests/data/valid/toml-lang-compliance/valid/float/spec-float-8.toml b/tests/data/valid/toml-lang-compliance/valid/float/spec-float-8.toml
new file mode 100644
index 0000000..3c8f0aa
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/float/spec-float-8.toml
@@ -0,0 +1 @@
+flt8 = 224_617.445_991_228
diff --git a/tests/data/valid/toml-lang-compliance/valid/float/spec-float-9.json b/tests/data/valid/toml-lang-compliance/valid/float/spec-float-9.json
new file mode 100644
index 0000000..2a45bd9
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/float/spec-float-9.json
@@ -0,0 +1,2 @@
+{"flt9":
+ {"type":"float","value":"-0"}}
diff --git a/tests/data/valid/toml-lang-compliance/valid/float/spec-float-9.toml b/tests/data/valid/toml-lang-compliance/valid/float/spec-float-9.toml
new file mode 100644
index 0000000..7e65ade
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/float/spec-float-9.toml
@@ -0,0 +1 @@
+flt9 = -0e0
diff --git a/tests/data/valid/toml-lang-compliance/valid/integer/spec-int-1.json b/tests/data/valid/toml-lang-compliance/valid/integer/spec-int-1.json
new file mode 100644
index 0000000..4758126
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/integer/spec-int-1.json
@@ -0,0 +1,2 @@
+{"int1":
+ {"type":"integer","value":"99"}}
diff --git a/tests/data/valid/toml-lang-compliance/valid/integer/spec-int-1.toml b/tests/data/valid/toml-lang-compliance/valid/integer/spec-int-1.toml
new file mode 100644
index 0000000..bdf594d
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/integer/spec-int-1.toml
@@ -0,0 +1 @@
+int1 = +99
diff --git a/tests/data/valid/toml-lang-compliance/valid/integer/spec-int-2.json b/tests/data/valid/toml-lang-compliance/valid/integer/spec-int-2.json
new file mode 100644
index 0000000..32b6f78
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/integer/spec-int-2.json
@@ -0,0 +1,2 @@
+{"int2":
+ {"type":"integer","value":"42"}}
diff --git a/tests/data/valid/toml-lang-compliance/valid/integer/spec-int-2.toml b/tests/data/valid/toml-lang-compliance/valid/integer/spec-int-2.toml
new file mode 100644
index 0000000..7e63963
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/integer/spec-int-2.toml
@@ -0,0 +1 @@
+int2 = 42
diff --git a/tests/data/valid/toml-lang-compliance/valid/integer/spec-int-3.json b/tests/data/valid/toml-lang-compliance/valid/integer/spec-int-3.json
new file mode 100644
index 0000000..94fb5c6
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/integer/spec-int-3.json
@@ -0,0 +1,2 @@
+{"int3":
+ {"type":"integer","value":"0"}}
diff --git a/tests/data/valid/toml-lang-compliance/valid/integer/spec-int-3.toml b/tests/data/valid/toml-lang-compliance/valid/integer/spec-int-3.toml
new file mode 100644
index 0000000..2bc61bf
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/integer/spec-int-3.toml
@@ -0,0 +1 @@
+int3 = 0
diff --git a/tests/data/valid/toml-lang-compliance/valid/integer/spec-int-3a.json b/tests/data/valid/toml-lang-compliance/valid/integer/spec-int-3a.json
new file mode 100644
index 0000000..c4066d9
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/integer/spec-int-3a.json
@@ -0,0 +1,2 @@
+{"int3a":
+ {"type":"integer","value":"0"}}
diff --git a/tests/data/valid/toml-lang-compliance/valid/integer/spec-int-3a.toml b/tests/data/valid/toml-lang-compliance/valid/integer/spec-int-3a.toml
new file mode 100644
index 0000000..cf7fcb9
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/integer/spec-int-3a.toml
@@ -0,0 +1 @@
+int3a = +0
diff --git a/tests/data/valid/toml-lang-compliance/valid/integer/spec-int-3b.json b/tests/data/valid/toml-lang-compliance/valid/integer/spec-int-3b.json
new file mode 100644
index 0000000..d494ea8
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/integer/spec-int-3b.json
@@ -0,0 +1,2 @@
+{"int3b":
+ {"type":"integer","value":"0"}}
diff --git a/tests/data/valid/toml-lang-compliance/valid/integer/spec-int-3b.toml b/tests/data/valid/toml-lang-compliance/valid/integer/spec-int-3b.toml
new file mode 100644
index 0000000..1f1f36b
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/integer/spec-int-3b.toml
@@ -0,0 +1 @@
+int3b = -0
diff --git a/tests/data/valid/toml-lang-compliance/valid/integer/spec-int-4.json b/tests/data/valid/toml-lang-compliance/valid/integer/spec-int-4.json
new file mode 100644
index 0000000..2fd9cd4
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/integer/spec-int-4.json
@@ -0,0 +1,2 @@
+{"int4":
+ {"type":"integer","value":"-17"}}
diff --git a/tests/data/valid/toml-lang-compliance/valid/integer/spec-int-4.toml b/tests/data/valid/toml-lang-compliance/valid/integer/spec-int-4.toml
new file mode 100644
index 0000000..d6ecc41
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/integer/spec-int-4.toml
@@ -0,0 +1 @@
+int4 = -17
diff --git a/tests/data/valid/toml-lang-compliance/valid/integer/spec-int-5.json b/tests/data/valid/toml-lang-compliance/valid/integer/spec-int-5.json
new file mode 100644
index 0000000..595eca8
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/integer/spec-int-5.json
@@ -0,0 +1,2 @@
+{"int5":
+ {"type":"integer","value":"1000"}}
diff --git a/tests/data/valid/toml-lang-compliance/valid/integer/spec-int-5.toml b/tests/data/valid/toml-lang-compliance/valid/integer/spec-int-5.toml
new file mode 100644
index 0000000..9df1153
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/integer/spec-int-5.toml
@@ -0,0 +1 @@
+int5 = 1_000
diff --git a/tests/data/valid/toml-lang-compliance/valid/integer/spec-int-6.json b/tests/data/valid/toml-lang-compliance/valid/integer/spec-int-6.json
new file mode 100644
index 0000000..9cd6f4d
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/integer/spec-int-6.json
@@ -0,0 +1,2 @@
+{"int6":
+ {"type":"integer","value":"5349221"}}
diff --git a/tests/data/valid/toml-lang-compliance/valid/integer/spec-int-6.toml b/tests/data/valid/toml-lang-compliance/valid/integer/spec-int-6.toml
new file mode 100644
index 0000000..bae369f
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/integer/spec-int-6.toml
@@ -0,0 +1 @@
+int6 = 5_349_221
diff --git a/tests/data/valid/toml-lang-compliance/valid/integer/spec-int-7.json b/tests/data/valid/toml-lang-compliance/valid/integer/spec-int-7.json
new file mode 100644
index 0000000..e63f070
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/integer/spec-int-7.json
@@ -0,0 +1,2 @@
+{"int7":
+ {"type":"integer","value":"12345"}}
diff --git a/tests/data/valid/toml-lang-compliance/valid/integer/spec-int-7.toml b/tests/data/valid/toml-lang-compliance/valid/integer/spec-int-7.toml
new file mode 100644
index 0000000..54b023f
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/integer/spec-int-7.toml
@@ -0,0 +1 @@
+int7 = 1_2_3_4_5 # VALID but discouraged
diff --git a/tests/data/valid/toml-lang-compliance/valid/integer/spec-int-bin1.json b/tests/data/valid/toml-lang-compliance/valid/integer/spec-int-bin1.json
new file mode 100644
index 0000000..ead108f
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/integer/spec-int-bin1.json
@@ -0,0 +1,2 @@
+{"bin1":
+ {"type":"integer","value":"214"}}
diff --git a/tests/data/valid/toml-lang-compliance/valid/integer/spec-int-bin1.toml b/tests/data/valid/toml-lang-compliance/valid/integer/spec-int-bin1.toml
new file mode 100644
index 0000000..57ed4c6
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/integer/spec-int-bin1.toml
@@ -0,0 +1 @@
+bin1 = 0b11010110
diff --git a/tests/data/valid/toml-lang-compliance/valid/integer/spec-int-hex1.json b/tests/data/valid/toml-lang-compliance/valid/integer/spec-int-hex1.json
new file mode 100644
index 0000000..d9cdd4c
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/integer/spec-int-hex1.json
@@ -0,0 +1,2 @@
+{"hex1":
+ {"type":"integer","value":"3735928559"}}
diff --git a/tests/data/valid/toml-lang-compliance/valid/integer/spec-int-hex1.toml b/tests/data/valid/toml-lang-compliance/valid/integer/spec-int-hex1.toml
new file mode 100644
index 0000000..55809d6
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/integer/spec-int-hex1.toml
@@ -0,0 +1 @@
+hex1 = 0xDEADBEEF
diff --git a/tests/data/valid/toml-lang-compliance/valid/integer/spec-int-hex2.json b/tests/data/valid/toml-lang-compliance/valid/integer/spec-int-hex2.json
new file mode 100644
index 0000000..bca55c1
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/integer/spec-int-hex2.json
@@ -0,0 +1,2 @@
+{"hex2":
+ {"type":"integer","value":"3735928559"}}
diff --git a/tests/data/valid/toml-lang-compliance/valid/integer/spec-int-hex2.toml b/tests/data/valid/toml-lang-compliance/valid/integer/spec-int-hex2.toml
new file mode 100644
index 0000000..0b74664
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/integer/spec-int-hex2.toml
@@ -0,0 +1 @@
+hex2 = 0xdeadbeef
diff --git a/tests/data/valid/toml-lang-compliance/valid/integer/spec-int-hex3.json b/tests/data/valid/toml-lang-compliance/valid/integer/spec-int-hex3.json
new file mode 100644
index 0000000..d0a6c4d
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/integer/spec-int-hex3.json
@@ -0,0 +1,2 @@
+{"hex3":
+ {"type":"integer","value":"3735928559"}}
diff --git a/tests/data/valid/toml-lang-compliance/valid/integer/spec-int-hex3.toml b/tests/data/valid/toml-lang-compliance/valid/integer/spec-int-hex3.toml
new file mode 100644
index 0000000..b9efc69
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/integer/spec-int-hex3.toml
@@ -0,0 +1 @@
+hex3 = 0xdead_beef
diff --git a/tests/data/valid/toml-lang-compliance/valid/integer/spec-int-max.json b/tests/data/valid/toml-lang-compliance/valid/integer/spec-int-max.json
new file mode 100644
index 0000000..1c47be9
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/integer/spec-int-max.json
@@ -0,0 +1,2 @@
+{"max":
+ {"type":"integer","value":"9223372036854775807"}}
diff --git a/tests/data/valid/toml-lang-compliance/valid/integer/spec-int-max.toml b/tests/data/valid/toml-lang-compliance/valid/integer/spec-int-max.toml
new file mode 100644
index 0000000..37a4d75
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/integer/spec-int-max.toml
@@ -0,0 +1 @@
+max=9_223_372_036_854_775_807
diff --git a/tests/data/valid/toml-lang-compliance/valid/integer/spec-int-min.json b/tests/data/valid/toml-lang-compliance/valid/integer/spec-int-min.json
new file mode 100644
index 0000000..0a1a684
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/integer/spec-int-min.json
@@ -0,0 +1,2 @@
+{"min":
+ {"type":"integer","value":"-9223372036854775808"}}
diff --git a/tests/data/valid/toml-lang-compliance/valid/integer/spec-int-min.toml b/tests/data/valid/toml-lang-compliance/valid/integer/spec-int-min.toml
new file mode 100644
index 0000000..f0b9180
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/integer/spec-int-min.toml
@@ -0,0 +1 @@
+min=-9_223_372_036_854_775_808
diff --git a/tests/data/valid/toml-lang-compliance/valid/integer/spec-int-oct1.json b/tests/data/valid/toml-lang-compliance/valid/integer/spec-int-oct1.json
new file mode 100644
index 0000000..4cbc2ed
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/integer/spec-int-oct1.json
@@ -0,0 +1,2 @@
+{"oct1":
+ {"type":"integer","value":"342391"}}
diff --git a/tests/data/valid/toml-lang-compliance/valid/integer/spec-int-oct1.toml b/tests/data/valid/toml-lang-compliance/valid/integer/spec-int-oct1.toml
new file mode 100644
index 0000000..3761533
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/integer/spec-int-oct1.toml
@@ -0,0 +1 @@
+oct1 = 0o01234567
diff --git a/tests/data/valid/toml-lang-compliance/valid/integer/spec-int-oct2.json b/tests/data/valid/toml-lang-compliance/valid/integer/spec-int-oct2.json
new file mode 100644
index 0000000..55d7e15
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/integer/spec-int-oct2.json
@@ -0,0 +1,2 @@
+{"oct2":
+ {"type":"integer","value":"493"}}
diff --git a/tests/data/valid/toml-lang-compliance/valid/integer/spec-int-oct2.toml b/tests/data/valid/toml-lang-compliance/valid/integer/spec-int-oct2.toml
new file mode 100644
index 0000000..45e161b
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/integer/spec-int-oct2.toml
@@ -0,0 +1 @@
+oct2 = 0o755 # useful for Unix file permissions
diff --git a/tests/data/valid/toml-lang-compliance/valid/key-value/spec-case-sensitive.json b/tests/data/valid/toml-lang-compliance/valid/key-value/spec-case-sensitive.json
new file mode 100644
index 0000000..205ad43
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/key-value/spec-case-sensitive.json
@@ -0,0 +1,4 @@
+{"abc":
+ {"type":"integer","value":"123"},
+ "ABC":
+ {"type":"integer","value":"456"}}
diff --git a/tests/data/valid/toml-lang-compliance/valid/key-value/spec-case-sensitive.toml b/tests/data/valid/toml-lang-compliance/valid/key-value/spec-case-sensitive.toml
new file mode 100644
index 0000000..896bc97
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/key-value/spec-case-sensitive.toml
@@ -0,0 +1,3 @@
+# TOML is case sensitive.
+abc = 123
+ABC = 456
diff --git a/tests/data/valid/toml-lang-compliance/valid/key-value/spec-dotted-keys-1.json b/tests/data/valid/toml-lang-compliance/valid/key-value/spec-dotted-keys-1.json
new file mode 100644
index 0000000..5a00cbe
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/key-value/spec-dotted-keys-1.json
@@ -0,0 +1,10 @@
+{"name":
+ {"type":"string","value":"Orange"},
+ "physical":
+ {"color":
+ {"type":"string","value":"orange"},
+ "shape":
+ {"type":"string","value":"round"}},
+ "site":
+ {"google.com":
+ {"type":"boolean","value":"true"}}}
diff --git a/tests/data/valid/toml-lang-compliance/valid/key-value/spec-dotted-keys-1.toml b/tests/data/valid/toml-lang-compliance/valid/key-value/spec-dotted-keys-1.toml
new file mode 100644
index 0000000..8f83571
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/key-value/spec-dotted-keys-1.toml
@@ -0,0 +1,4 @@
+name = "Orange"
+physical.color = "orange"
+physical.shape = "round"
+site."google.com" = true
diff --git a/tests/data/valid/toml-lang-compliance/valid/key-value/spec-dotted-keys-2.json b/tests/data/valid/toml-lang-compliance/valid/key-value/spec-dotted-keys-2.json
new file mode 100644
index 0000000..fb831fa
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/key-value/spec-dotted-keys-2.json
@@ -0,0 +1,3 @@
+{"a":
+ {"b":
+ {"type":"integer","value":"23"}}}
diff --git a/tests/data/valid/toml-lang-compliance/valid/key-value/spec-dotted-keys-2.toml b/tests/data/valid/toml-lang-compliance/valid/key-value/spec-dotted-keys-2.toml
new file mode 100644
index 0000000..99f9a53
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/key-value/spec-dotted-keys-2.toml
@@ -0,0 +1 @@
+a . b = 23
diff --git a/tests/data/valid/toml-lang-compliance/valid/key-value/spec-dotted-keys-3.json b/tests/data/valid/toml-lang-compliance/valid/key-value/spec-dotted-keys-3.json
new file mode 100644
index 0000000..fb831fa
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/key-value/spec-dotted-keys-3.json
@@ -0,0 +1,3 @@
+{"a":
+ {"b":
+ {"type":"integer","value":"23"}}}
diff --git a/tests/data/valid/toml-lang-compliance/valid/key-value/spec-dotted-keys-3.toml b/tests/data/valid/toml-lang-compliance/valid/key-value/spec-dotted-keys-3.toml
new file mode 100644
index 0000000..12796e9
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/key-value/spec-dotted-keys-3.toml
@@ -0,0 +1 @@
+a . b = 23
diff --git a/tests/data/valid/toml-lang-compliance/valid/key-value/spec-empty-key-name-1.json b/tests/data/valid/toml-lang-compliance/valid/key-value/spec-empty-key-name-1.json
new file mode 100644
index 0000000..aaea034
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/key-value/spec-empty-key-name-1.json
@@ -0,0 +1,2 @@
+{"":
+ {"type":"string","value":"blank"}}
diff --git a/tests/data/valid/toml-lang-compliance/valid/key-value/spec-empty-key-name-1.toml b/tests/data/valid/toml-lang-compliance/valid/key-value/spec-empty-key-name-1.toml
new file mode 100644
index 0000000..5aea8ee
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/key-value/spec-empty-key-name-1.toml
@@ -0,0 +1 @@
+"" = "blank" # VALID but discouraged
diff --git a/tests/data/valid/toml-lang-compliance/valid/key-value/spec-empty-key-name-2.json b/tests/data/valid/toml-lang-compliance/valid/key-value/spec-empty-key-name-2.json
new file mode 100644
index 0000000..aaea034
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/key-value/spec-empty-key-name-2.json
@@ -0,0 +1,2 @@
+{"":
+ {"type":"string","value":"blank"}}
diff --git a/tests/data/valid/toml-lang-compliance/valid/key-value/spec-empty-key-name-2.toml b/tests/data/valid/toml-lang-compliance/valid/key-value/spec-empty-key-name-2.toml
new file mode 100644
index 0000000..388027d
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/key-value/spec-empty-key-name-2.toml
@@ -0,0 +1 @@
+'' = "blank" # VALID but discouraged
diff --git a/tests/data/valid/toml-lang-compliance/valid/key-value/spec-key-value-pair-1.json b/tests/data/valid/toml-lang-compliance/valid/key-value/spec-key-value-pair-1.json
new file mode 100644
index 0000000..042895f
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/key-value/spec-key-value-pair-1.json
@@ -0,0 +1,2 @@
+{"key":
+ {"type":"string","value":"value"}}
diff --git a/tests/data/valid/toml-lang-compliance/valid/key-value/spec-key-value-pair-1.toml b/tests/data/valid/toml-lang-compliance/valid/key-value/spec-key-value-pair-1.toml
new file mode 100644
index 0000000..e5b34eb
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/key-value/spec-key-value-pair-1.toml
@@ -0,0 +1 @@
+key = "value"
diff --git a/tests/data/valid/toml-lang-compliance/valid/key-value/spec-key-value-pair-2.json b/tests/data/valid/toml-lang-compliance/valid/key-value/spec-key-value-pair-2.json
new file mode 100644
index 0000000..2afb8ce
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/key-value/spec-key-value-pair-2.json
@@ -0,0 +1,2 @@
+{"bare_key":
+ {"type":"string","value":"value"}}
diff --git a/tests/data/valid/toml-lang-compliance/valid/key-value/spec-key-value-pair-2.toml b/tests/data/valid/toml-lang-compliance/valid/key-value/spec-key-value-pair-2.toml
new file mode 100644
index 0000000..95c8824
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/key-value/spec-key-value-pair-2.toml
@@ -0,0 +1 @@
+bare_key = "value"
diff --git a/tests/data/valid/toml-lang-compliance/valid/key-value/spec-key-value-pair-3.json b/tests/data/valid/toml-lang-compliance/valid/key-value/spec-key-value-pair-3.json
new file mode 100644
index 0000000..5ed4c11
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/key-value/spec-key-value-pair-3.json
@@ -0,0 +1,2 @@
+{"bare-key":
+ {"type":"string","value":"value"}}
diff --git a/tests/data/valid/toml-lang-compliance/valid/key-value/spec-key-value-pair-3.toml b/tests/data/valid/toml-lang-compliance/valid/key-value/spec-key-value-pair-3.toml
new file mode 100644
index 0000000..aaee679
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/key-value/spec-key-value-pair-3.toml
@@ -0,0 +1 @@
+bare-key = "value"
diff --git a/tests/data/valid/toml-lang-compliance/valid/key-value/spec-key-value-pair-4.json b/tests/data/valid/toml-lang-compliance/valid/key-value/spec-key-value-pair-4.json
new file mode 100644
index 0000000..a0ac291
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/key-value/spec-key-value-pair-4.json
@@ -0,0 +1,2 @@
+{"1234":
+ {"type":"string","value":"value"}}
diff --git a/tests/data/valid/toml-lang-compliance/valid/key-value/spec-key-value-pair-4.toml b/tests/data/valid/toml-lang-compliance/valid/key-value/spec-key-value-pair-4.toml
new file mode 100644
index 0000000..32b6bbe
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/key-value/spec-key-value-pair-4.toml
@@ -0,0 +1 @@
+1234 = "value"
diff --git a/tests/data/valid/toml-lang-compliance/valid/key-value/spec-key-value-pair-5.json b/tests/data/valid/toml-lang-compliance/valid/key-value/spec-key-value-pair-5.json
new file mode 100644
index 0000000..a0ac291
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/key-value/spec-key-value-pair-5.json
@@ -0,0 +1,2 @@
+{"1234":
+ {"type":"string","value":"value"}}
diff --git a/tests/data/valid/toml-lang-compliance/valid/key-value/spec-key-value-pair-5.toml b/tests/data/valid/toml-lang-compliance/valid/key-value/spec-key-value-pair-5.toml
new file mode 100644
index 0000000..201fff6
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/key-value/spec-key-value-pair-5.toml
@@ -0,0 +1 @@
+1234="value"
diff --git a/tests/data/valid/toml-lang-compliance/valid/key-value/spec-key-value-pair-6.json b/tests/data/valid/toml-lang-compliance/valid/key-value/spec-key-value-pair-6.json
new file mode 100644
index 0000000..b5cf310
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/key-value/spec-key-value-pair-6.json
@@ -0,0 +1,2 @@
+{"-":
+ {"type":"integer","value":"1"}}
diff --git a/tests/data/valid/toml-lang-compliance/valid/key-value/spec-key-value-pair-6.toml b/tests/data/valid/toml-lang-compliance/valid/key-value/spec-key-value-pair-6.toml
new file mode 100644
index 0000000..42e39cd
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/key-value/spec-key-value-pair-6.toml
@@ -0,0 +1 @@
+-=1
diff --git a/tests/data/valid/toml-lang-compliance/valid/key-value/spec-key-value-pair-7.json b/tests/data/valid/toml-lang-compliance/valid/key-value/spec-key-value-pair-7.json
new file mode 100644
index 0000000..e43ff0c
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/key-value/spec-key-value-pair-7.json
@@ -0,0 +1,2 @@
+{"_":
+ {"type":"integer","value":"1"}}
diff --git a/tests/data/valid/toml-lang-compliance/valid/key-value/spec-key-value-pair-7.toml b/tests/data/valid/toml-lang-compliance/valid/key-value/spec-key-value-pair-7.toml
new file mode 100644
index 0000000..84812f0
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/key-value/spec-key-value-pair-7.toml
@@ -0,0 +1 @@
+_=1
diff --git a/tests/data/valid/toml-lang-compliance/valid/key-value/spec-key-value-pair-8.json b/tests/data/valid/toml-lang-compliance/valid/key-value/spec-key-value-pair-8.json
new file mode 100644
index 0000000..e8cbba0
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/key-value/spec-key-value-pair-8.json
@@ -0,0 +1,2 @@
+{"-_-_-_-_-":
+ {"type":"integer","value":"1"}}
diff --git a/tests/data/valid/toml-lang-compliance/valid/key-value/spec-key-value-pair-8.toml b/tests/data/valid/toml-lang-compliance/valid/key-value/spec-key-value-pair-8.toml
new file mode 100644
index 0000000..022b096
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/key-value/spec-key-value-pair-8.toml
@@ -0,0 +1 @@
+-_-_-_-_-=1
diff --git a/tests/data/valid/toml-lang-compliance/valid/key-value/spec-key-value-pair-9.json b/tests/data/valid/toml-lang-compliance/valid/key-value/spec-key-value-pair-9.json
new file mode 100644
index 0000000..cd83f35
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/key-value/spec-key-value-pair-9.json
@@ -0,0 +1,3 @@
+{"3":
+ {"14159":
+ {"type":"string","value":"pi"}}}
diff --git a/tests/data/valid/toml-lang-compliance/valid/key-value/spec-key-value-pair-9.toml b/tests/data/valid/toml-lang-compliance/valid/key-value/spec-key-value-pair-9.toml
new file mode 100644
index 0000000..2efd659
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/key-value/spec-key-value-pair-9.toml
@@ -0,0 +1 @@
+3.14159 = "pi"
diff --git a/tests/data/valid/toml-lang-compliance/valid/key-value/spec-newline-1.json b/tests/data/valid/toml-lang-compliance/valid/key-value/spec-newline-1.json
new file mode 100644
index 0000000..8e72690
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/key-value/spec-newline-1.json
@@ -0,0 +1,4 @@
+{"abc":
+ {"type":"integer","value":"123"},
+ "def":
+ {"type":"integer","value":"456"}}
diff --git a/tests/data/valid/toml-lang-compliance/valid/key-value/spec-newline-1.toml b/tests/data/valid/toml-lang-compliance/valid/key-value/spec-newline-1.toml
new file mode 100644
index 0000000..4dfbebf
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/key-value/spec-newline-1.toml
@@ -0,0 +1,2 @@
+abc = 123
+def = 456
diff --git a/tests/data/valid/toml-lang-compliance/valid/key-value/spec-newline-2.json b/tests/data/valid/toml-lang-compliance/valid/key-value/spec-newline-2.json
new file mode 100644
index 0000000..8e72690
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/key-value/spec-newline-2.json
@@ -0,0 +1,4 @@
+{"abc":
+ {"type":"integer","value":"123"},
+ "def":
+ {"type":"integer","value":"456"}}
diff --git a/tests/data/valid/toml-lang-compliance/valid/key-value/spec-newline-2.toml b/tests/data/valid/toml-lang-compliance/valid/key-value/spec-newline-2.toml
new file mode 100644
index 0000000..4dfbebf
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/key-value/spec-newline-2.toml
@@ -0,0 +1,2 @@
+abc = 123
+def = 456
diff --git a/tests/data/valid/toml-lang-compliance/valid/key-value/spec-newline-3.json b/tests/data/valid/toml-lang-compliance/valid/key-value/spec-newline-3.json
new file mode 100644
index 0000000..bcc1387
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/key-value/spec-newline-3.json
@@ -0,0 +1,6 @@
+{"abc":
+ {"type":"integer","value":"123"},
+ "def":
+ {"type":"integer","value":"456"},
+ "ghi":
+ {"type":"integer","value":"789"}}
diff --git a/tests/data/valid/toml-lang-compliance/valid/key-value/spec-newline-3.toml b/tests/data/valid/toml-lang-compliance/valid/key-value/spec-newline-3.toml
new file mode 100644
index 0000000..86c2f93
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/key-value/spec-newline-3.toml
@@ -0,0 +1,3 @@
+abc = 123
+def = 456
+ghi = 789
diff --git a/tests/data/valid/toml-lang-compliance/valid/key-value/spec-quoted-basic-keys-1.json b/tests/data/valid/toml-lang-compliance/valid/key-value/spec-quoted-basic-keys-1.json
new file mode 100644
index 0000000..b53a8cb
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/key-value/spec-quoted-basic-keys-1.json
@@ -0,0 +1,2 @@
+{"ʎǝʞ":
+ {"type":"string","value":"value"}}
diff --git a/tests/data/valid/toml-lang-compliance/valid/key-value/spec-quoted-basic-keys-1.toml b/tests/data/valid/toml-lang-compliance/valid/key-value/spec-quoted-basic-keys-1.toml
new file mode 100644
index 0000000..e847bb5
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/key-value/spec-quoted-basic-keys-1.toml
@@ -0,0 +1 @@
+"ʎǝʞ" = "value"
diff --git a/tests/data/valid/toml-lang-compliance/valid/key-value/spec-quoted-literal-keys-1.json b/tests/data/valid/toml-lang-compliance/valid/key-value/spec-quoted-literal-keys-1.json
new file mode 100644
index 0000000..76465ca
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/key-value/spec-quoted-literal-keys-1.json
@@ -0,0 +1,2 @@
+{"quoted \"value\"":
+ {"type":"string","value":"value"}}
diff --git a/tests/data/valid/toml-lang-compliance/valid/key-value/spec-quoted-literal-keys-1.toml b/tests/data/valid/toml-lang-compliance/valid/key-value/spec-quoted-literal-keys-1.toml
new file mode 100644
index 0000000..024db29
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/key-value/spec-quoted-literal-keys-1.toml
@@ -0,0 +1 @@
+'quoted "value"' = "value"
diff --git a/tests/data/valid/toml-lang-compliance/valid/qa/qa-array-inline-1000.json b/tests/data/valid/toml-lang-compliance/valid/qa/qa-array-inline-1000.json
new file mode 100644
index 0000000..ebd9e43
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/qa/qa-array-inline-1000.json
@@ -0,0 +1,1003 @@
+{"key":
+ {"type":"array","value":[
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"abcdefg"},
+ {"type":"string","value":"end"}]}}
diff --git a/tests/data/valid/toml-lang-compliance/valid/qa/qa-array-inline-1000.toml b/tests/data/valid/toml-lang-compliance/valid/qa/qa-array-inline-1000.toml
new file mode 100644
index 0000000..3c90469
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/qa/qa-array-inline-1000.toml
@@ -0,0 +1,1003 @@
+key = [
+
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "abcdefg",
+ "end"]
diff --git a/tests/data/valid/toml-lang-compliance/valid/qa/qa-array-inline-nested-1000.toml b/tests/data/valid/toml-lang-compliance/valid/qa/qa-array-inline-nested-1000.toml
new file mode 100644
index 0000000..fa02520
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/qa/qa-array-inline-nested-1000.toml
@@ -0,0 +1 @@
+key = [[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]] ]
diff --git a/tests/data/valid/toml-lang-compliance/valid/qa/qa-key-literal-40kb.json b/tests/data/valid/toml-lang-compliance/valid/qa/qa-key-literal-40kb.json
new file mode 100644
index 0000000..8a45674
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/qa/qa-key-literal-40kb.json
@@ -0,0 +1,2 @@
+{"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Quam lacus suspendisse faucibus interdum posuere lorem ipsum dolor. Amet consectetur adipiscing elit ut. Nulla facilisi etiam dignissim diam quis enim lobortis. Curabitur vitae nunc sed velit dignissim sodales ut eu. Fames ac turpis egestas sed tempus urna et. Facilisi cras fermentum odio eu feugiat pretium. Nec tincidunt praesent semper feugiat nibh sed pulvinar proin gravida. Est lorem ipsum dolor sit amet consectetur adipiscing elit. Vel quam elementum pulvinar etiam non quam lacus. Pharetra et ultrices neque ornare aenean euismod. Nisl nisi scelerisque eu ultrices. Eget dolor morbi non arcu risus. Bibendum neque egestas congue quisque egestas diam in arcu cursus. Faucibus nisl tincidunt eget nullam. Nisl pretium fusce id velit ut tortor pretium viverra suspendisse. Mauris ultrices eros in cursus. Donec ac odio tempor orci dapibus ultrices in iaculis. Tellus cras adipiscing enim eu turpis egestas pretium aenean pharetra. Eros in cursus turpis massa. Nascetur ridiculus mus mauris vitae ultricies leo integer malesuada nunc. Velit sed ullamcorper morbi tincidunt ornare massa eget egestas purus. Aenean euismod elementum nisi quis eleifend quam. Magnis dis parturient montes nascetur ridiculus mus. Eu tincidunt tortor aliquam nulla facilisi cras. Tristique senectus et netus et malesuada fames. Urna nec tincidunt praesent semper feugiat nibh sed pulvinar. Vitae ultricies leo integer malesuada nunc vel risus commodo viverra. Ac turpis egestas sed tempus urna et. Amet mauris commodo quis imperdiet massa tincidunt. Urna nunc id cursus metus aliquam eleifend mi. In nulla posuere sollicitudin aliquam ultrices sagittis orci a scelerisque. Neque aliquam vestibulum morbi blandit cursus. Pulvinar mattis nunc sed blandit libero volutpat sed. Sed egestas egestas fringilla phasellus faucibus scelerisque eleifend donec pretium. Blandit cursus risus at ultrices mi tempus. Turpis massa sed elementum tempus egestas sed sed. Dictum varius duis at consectetur lorem. Commodo ullamcorper a lacus vestibulum sed arcu non. Dolor magna eget est lorem. Tincidunt arcu non sodales neque sodales ut etiam sit amet. Sit amet risus nullam eget felis eget nunc lobortis. Risus in hendrerit gravida rutrum quisque non tellus orci. Elementum pulvinar etiam non quam lacus suspendisse faucibus. Morbi tristique senectus et netus et malesuada. In aliquam sem fringilla ut morbi tincidunt. Ornare aenean euismod elementum nisi quis eleifend quam. Sed id semper risus in hendrerit gravida rutrum quisque. Lorem ipsum dolor sit amet consectetur adipiscing elit. A condimentum vitae sapien pellentesque habitant morbi tristique senectus et. Faucibus purus in massa tempor nec feugiat nisl. Vehicula ipsum a arcu cursus vitae congue. Facilisi cras fermentum odio eu feugiat pretium nibh. Viverra mauris in aliquam sem fringilla ut morbi tincidunt. Ultrices dui sapien eget mi proin sed libero enim. Nisi est sit amet facilisis magna etiam tempor. Posuere ac ut consequat semper viverra nam. Dis parturient montes nascetur ridiculus mus mauris vitae. Nec sagittis aliquam malesuada bibendum. Mattis pellentesque id nibh tortor id aliquet lectus. Vitae congue eu consequat ac felis donec et. Cras sed felis eget velit aliquet sagittis id consectetur purus. Pellentesque elit ullamcorper dignissim cras tincidunt. Pellentesque dignissim enim sit amet venenatis urna. A cras semper auctor neque vitae tempus. Amet massa vitae tortor condimentum lacinia quis vel eros donec. Tempor commodo ullamcorper a lacus. Nibh tellus molestie nunc non blandit massa enim nec dui. Viverra orci sagittis eu volutpat odio facilisis mauris sit. Sed augue lacus viverra vitae. Vulputate eu scelerisque felis imperdiet proin fermentum leo vel orci. Tellus rutrum tellus pellentesque eu tincidunt tortor. Cras semper auctor neque vitae tempus quam pellentesque nec. Lorem ipsum dolor sit amet consectetur adipiscing elit ut aliquam. Tristique magna sit amet purus gravida quis blandit turpis. Viverra ipsum nunc aliquet bibendum. Arcu bibendum at varius vel. Amet mattis vulputate enim nulla. Vulputate enim nulla aliquet porttitor. Volutpat blandit aliquam etiam erat velit scelerisque in dictum. Morbi tristique senectus et netus et malesuada fames ac. Faucibus et molestie ac feugiat sed. Tellus elementum sagittis vitae et leo duis. Id aliquet lectus proin nibh. Ornare arcu dui vivamus arcu. Morbi tincidunt augue interdum velit euismod in pellentesque massa placerat. Quis eleifend quam adipiscing vitae. Tristique senectus et netus et malesuada fames ac turpis. Pharetra convallis posuere morbi leo. Ornare arcu odio ut sem nulla pharetra diam sit. Morbi tristique senectus et netus et. Dictum non consectetur a erat nam at lectus urna. Varius vel pharetra vel turpis. Mi ipsum faucibus vitae aliquet. Tellus in metus vulputate eu scelerisque felis imperdiet proin. In est ante in nibh mauris cursus mattis. Massa ultricies mi quis hendrerit dolor magna eget. Fermentum leo vel orci porta. Elit ut aliquam purus sit amet luctus venenatis lectus. Eget aliquet nibh praesent tristique magna sit amet. Arcu non odio euismod lacinia at quis. Montes nascetur ridiculus mus mauris vitae ultricies. Tempus quam pellentesque nec nam aliquam sem et tortor. Morbi leo urna molestie at elementum eu facilisis sed. In fermentum posuere urna nec tincidunt. Neque aliquam vestibulum morbi blandit cursus risus. Vulputate dignissim suspendisse in est ante in nibh mauris cursus. Lorem ipsum dolor sit amet consectetur adipiscing. Orci eu lobortis elementum nibh tellus molestie nunc non. Enim diam vulputate ut pharetra sit amet aliquam. Convallis convallis tellus id interdum velit laoreet id donec ultrices. Sit amet mattis vulputate enim nulla aliquet porttitor lacus luctus. A lacus vestibulum sed arcu non odio. Ut tortor pretium viverra suspendisse potenti nullam ac tortor. Diam vel quam elementum pulvinar etiam non quam. Viverra justo nec ultrices dui. Eu volutpat odio facilisis mauris sit amet massa. Sed ullamcorper morbi tincidunt ornare massa eget egestas purus. Ac felis donec et odio pellentesque. Nisl vel pretium lectus quam id leo in. Ultricies lacus sed turpis tincidunt id. At urna condimentum mattis pellentesque id nibh tortor id. Sem nulla pharetra diam sit amet nisl suscipit. Neque viverra justo nec ultrices. Arcu cursus euismod quis viverra nibh cras pulvinar. Dolor sit amet consectetur adipiscing elit ut aliquam purus. Id diam vel quam elementum pulvinar etiam non. Elementum pulvinar etiam non quam lacus suspendisse faucibus. Id aliquet lectus proin nibh nisl condimentum id venenatis. Sit amet consectetur adipiscing elit duis tristique sollicitudin nibh. Sed faucibus turpis in eu mi bibendum neque egestas congue. Consectetur libero id faucibus nisl tincidunt eget nullam. At volutpat diam ut venenatis tellus in metus vulputate eu. Condimentum lacinia quis vel eros donec ac odio. Sit amet porttitor eget dolor morbi non arcu risus quis. Viverra mauris in aliquam sem fringilla ut morbi tincidunt. Metus dictum at tempor commodo ullamcorper. At ultrices mi tempus imperdiet nulla. Est ullamcorper eget nulla facilisi etiam dignissim diam quis. Lobortis elementum nibh tellus molestie nunc non. Placerat in egestas erat imperdiet sed. Placerat in egestas erat imperdiet sed euismod. Lobortis feugiat vivamus at augue eget arcu dictum varius. Ut sem nulla pharetra diam sit amet. Et tortor at risus viverra adipiscing at in. Tempor nec feugiat nisl pretium. Cursus euismod quis viverra nibh. Eget mi proin sed libero enim sed. Aliquam id diam maecenas ultricies. Mi tempus imperdiet nulla malesuada pellentesque elit eget. Gravida quis blandit turpis cursus in hac habitasse platea dictumst. Sed tempus urna et pharetra pharetra massa massa. Dolor purus non enim praesent elementum facilisis leo vel. Pharetra vel turpis nunc eget. Quam pellentesque nec nam aliquam sem et tortor consequat id. Orci eu lobortis elementum nibh tellus molestie nunc non. Porttitor leo a diam sollicitudin tempor id. Tincidunt ornare massa eget egestas purus viverra accumsan in nisl. Quam lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Elit ut aliquam purus sit amet luctus venenatis lectus. Velit egestas dui id ornare arcu odio ut sem nulla. Lacus viverra vitae congue eu consequat ac felis donec. Nulla aliquet porttitor lacus luctus accumsan tortor posuere ac ut. Lorem dolor sed viverra ipsum. Blandit libero volutpat sed cras ornare arcu. Egestas erat imperdiet sed euismod nisi porta lorem mollis. Viverra maecenas accumsan lacus vel. Enim neque volutpat ac tincidunt. Porttitor massa id neque aliquam vestibulum morbi blandit cursus risus. Malesuada bibendum arcu vitae elementum curabitur vitae nunc. Et malesuada fames ac turpis egestas integer. Egestas egestas fringilla phasellus faucibus scelerisque eleifend donec pretium. Est placerat in egestas erat imperdiet sed. Non arcu risus quis varius quam quisque. Lorem mollis aliquam ut porttitor leo a. Viverra tellus in hac habitasse platea dictumst vestibulum rhoncus. Fermentum iaculis eu non diam. Erat imperdiet sed euismod nisi porta lorem mollis aliquam. Varius vel pharetra vel turpis nunc eget lorem dolor. Rhoncus mattis rhoncus urna neque viverra. Hac habitasse platea dictumst quisque sagittis purus sit. At quis risus sed vulputate odio ut enim. Pharetra magna ac placerat vestibulum lectus mauris ultrices eros. Rutrum quisque non tellus orci ac auctor. Iaculis eu non diam phasellus vestibulum lorem sed. Ut sem nulla pharetra diam sit amet nisl suscipit. Risus at ultrices mi tempus. Vitae tortor condimentum lacinia quis vel eros donec. Sed tempus urna et pharetra. Posuere sollicitudin aliquam ultrices sagittis orci. Congue quisque egestas diam in arcu. Hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Pellentesque habitant morbi tristique senectus et netus et. Id interdum velit laoreet id. Fusce ut placerat orci nulla pellentesque dignissim. Pretium nibh ipsum consequat nisl vel pretium. Etiam erat velit scelerisque in dictum non consectetur a. Turpis in eu mi bibendum neque egestas congue quisque egestas. Pulvinar sapien et ligula ullamcorper malesuada. Ultricies tristique nulla aliquet enim tortor at. Suspendisse interdum consectetur libero id faucibus. Lorem sed risus ultricies tristique nulla aliquet. Tristique senectus et netus et malesuada fames. Eu augue ut lectus arcu bibendum at varius vel. Egestas sed tempus urna et pharetra pharetra massa massa ultricies. Aliquet eget sit amet tellus cras adipiscing. Massa placerat duis ultricies lacus sed turpis tincidunt id aliquet. Ornare massa eget egestas purus viverra accumsan in nisl. Justo laoreet sit amet cursus sit amet. In metus vulputate eu scelerisque felis imperdiet proin. At erat pellentesque adipiscing commodo elit at. Ipsum suspendisse ultrices gravida dictum fusce. Lectus sit amet est placerat in egestas erat. Aliquam ultrices sagittis orci a. Sagittis id consectetur purus ut faucibus pulvinar elementum. Ornare arcu odio ut sem nulla pharetra diam. Sit amet purus gravida quis blandit turpis cursus. Duis ultricies lacus sed turpis tincidunt. Malesuada fames ac turpis egestas sed tempus urna et. Viverra ipsum nunc aliquet bibendum enim facilisis. Et pharetra pharetra massa massa ultricies mi quis. Eget duis at tellus at urna condimentum mattis. Euismod in pellentesque massa placerat. Enim nunc faucibus a pellentesque sit amet porttitor. Dolor sed viverra ipsum nunc aliquet. Donec enim diam vulputate ut pharetra sit amet. Feugiat sed lectus vestibulum mattis ullamcorper velit sed. Erat pellentesque adipiscing commodo elit at imperdiet. Nisl purus in mollis nunc sed id semper risus. Tincidunt augue interdum velit euismod in pellentesque massa. Facilisis magna etiam tempor orci. Mauris in aliquam sem fringilla ut. Gravida dictum fusce ut placerat orci. Sed risus ultricies tristique nulla. Odio morbi quis commodo odio. Feugiat in ante metus dictum at tempor commodo ullamcorper. Porta non pulvinar neque laoreet suspendisse interdum. Etiam tempor orci eu lobortis elementum. Fusce ut placerat orci nulla pellentesque dignissim. Ornare lectus sit amet est placerat in egestas erat. Quis vel eros donec ac. Elementum pulvinar etiam non quam lacus. Sit amet tellus cras adipiscing enim eu turpis. Amet tellus cras adipiscing enim eu. Sed faucibus turpis in eu mi bibendum. Lectus proin nibh nisl condimentum id. Sollicitudin nibh sit amet commodo nulla. Sed tempus urna et pharetra pharetra massa massa. Magna eget est lorem ipsum. Elit ullamcorper dignissim cras tincidunt lobortis feugiat vivamus at. Fermentum dui faucibus in ornare quam viverra orci sagittis eu. Dignissim convallis aenean et tortor. Ut faucibus pulvinar elementum integer enim neque. Nibh cras pulvinar mattis nunc sed. Pellentesque sit amet porttitor eget dolor morbi. Mi eget mauris pharetra et ultrices neque ornare aenean euismod. Quis risus sed vulputate odio ut enim blandit volutpat. Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. In vitae turpis massa sed elementum tempus egestas sed sed. Urna id volutpat lacus laoreet non. Egestas pretium aenean pharetra magna ac placerat. Amet commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Donec et odio pellentesque diam volutpat commodo sed. Etiam non quam lacus suspendisse. Augue neque gravida in fermentum et sollicitudin ac orci. Eu feugiat pretium nibh ipsum. Nam at lectus urna duis convallis convallis tellus id. Egestas integer eget aliquet nibh. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae auctor. Urna condimentum mattis pellentesque id nibh tortor id. In egestas erat imperdiet sed euismod. Ut sem viverra aliquet eget sit amet tellus. Feugiat pretium nibh ipsum consequat nisl vel pretium. Volutpat odio facilisis mauris sit amet. Mi sit amet mauris commodo quis imperdiet massa tincidunt. Neque volutpat ac tincidunt vitae semper quis lectus nulla at. Nec feugiat in fermentum posuere urna nec. Ut venenatis tellus in metus vulputate eu. Vestibulum rhoncus est pellentesque elit ullamcorper dignissim. Eu scelerisque felis imperdiet proin. Vitae et leo duis ut diam quam nulla. Ut venenatis tellus in metus vulputate eu scelerisque. Tincidunt dui ut ornare lectus sit amet. Adipiscing diam donec adipiscing tristique risus. Turpis nunc eget lorem dolor sed viverra ipsum nunc aliquet. Non sodales neque sodales ut. Massa placerat duis ultricies lacus sed turpis tincidunt. Viverra orci sagittis eu volutpat odio facilisis mauris sit amet. Adipiscing vitae proin sagittis nisl. Vitae aliquet nec ullamcorper sit. Potenti nullam ac tortor vitae purus. Ultricies lacus sed turpis tincidunt id. Ut diam quam nulla porttitor massa id neque aliquam vestibulum. Semper eget duis at tellus at urna condimentum mattis pellentesque. Nec tincidunt praesent semper feugiat nibh sed pulvinar proin. Dictum fusce ut placerat orci nulla pellentesque dignissim. Amet luctus venenatis lectus magna fringilla urna. Quam quisque id diam vel quam elementum pulvinar. At tempor commodo ullamcorper a. Magna etiam tempor orci eu lobortis. Suspendisse ultrices gravida dictum fusce. Massa ultricies mi quis hendrerit dolor magna. Massa tincidunt nunc pulvinar sapien et ligula ullamcorper malesuada proin. Aliquet enim tortor at auctor urna nunc id. Semper feugiat nibh sed pulvinar proin gravida. Porttitor rhoncus dolor purus non enim. Metus aliquam eleifend mi in nulla. Lectus arcu bibendum at varius vel pharetra. Sed vulputate odio ut enim blandit volutpat. Et ligula ullamcorper malesuada proin libero nunc consequat interdum varius. Donec et odio pellentesque diam volutpat commodo. Id ornare arcu odio ut sem nulla pharetra diam sit. Est ullamcorper eget nulla facilisi etiam dignissim diam quis enim. Sagittis vitae et leo duis ut diam quam nulla. Elementum nisi quis eleifend quam. Congue mauris rhoncus aenean vel elit. Adipiscing elit duis tristique sollicitudin nibh sit. Egestas egestas fringilla phasellus faucibus scelerisque. Morbi tincidunt augue interdum velit euismod. Massa sed elementum tempus egestas sed sed. Id leo in vitae turpis massa sed elementum tempus egestas. In pellentesque massa placerat duis ultricies lacus sed turpis. Vitae proin sagittis nisl rhoncus mattis rhoncus. Enim tortor at auctor urna nunc id. In fermentum posuere urna nec tincidunt praesent semper feugiat nibh. Aliquam ut porttitor leo a diam sollicitudin tempor id. Pellentesque elit eget gravida cum sociis natoque. Molestie at elementum eu facilisis sed odio morbi quis. Tristique senectus et netus et malesuada fames ac turpis. Proin libero nunc consequat interdum varius sit amet mattis. Pellentesque id nibh tortor id. Risus sed vulputate odio ut enim blandit. Laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt eget. Morbi tincidunt augue interdum velit euismod in pellentesque. Pharetra pharetra massa massa ultricies mi quis hendrerit. Nunc aliquet bibendum enim facilisis gravida neque. Feugiat sed lectus vestibulum mattis ullamcorper velit sed ullamcorper. Risus quis varius quam quisque id diam vel. Et ultrices neque ornare aenean. Aliquet sagittis id consectetur purus ut faucibus pulvinar elementum. Nibh ipsum consequat nisl vel. Mauris rhoncus aenean vel elit scelerisque mauris pellentesque pulvinar. Ornare quam viverra orci sagittis eu volutpat odio facilisis. Euismod nisi porta lorem mollis aliquam. Enim ut tellus elementum sagittis. Rhoncus mattis rhoncus urna neque. Malesuada fames ac turpis egestas. Cursus in hac habitasse platea dictumst quisque sagittis. Sit amet aliquam id diam maecenas ultricies mi eget mauris. Enim sit amet venenatis urna cursus eget nunc. Fermentum odio eu feugiat pretium nibh ipsum consequat. Eu scelerisque felis imperdiet proin. Nullam non nisi est sit amet facilisis magna etiam tempor. In mollis nunc sed id semper risus in hendrerit. Sollicitudin nibh sit amet commodo nulla facilisi nullam. Sit amet nisl purus in mollis nunc sed id. Nam libero justo laoreet sit amet cursus sit amet dictum. Condimentum id venenatis a condimentum vitae sapien pellentesque. Porta nibh venenatis cras sed felis. Lectus nulla at volutpat diam ut venenatis tellus in. Aliquam etiam erat velit scelerisque in dictum non consectetur a. Leo vel fringilla est ullamcorper eget. Sodales ut etiam sit amet nisl purus in mollis nunc. Euismod nisi porta lorem mollis aliquam. Ornare arcu odio ut sem nulla. Sed felis eget velit aliquet sagittis id consectetur. Pellentesque nec nam aliquam sem et tortor consequat id. Enim nec dui nunc mattis enim ut tellus elementum. Nullam non nisi est sit amet facilisis magna. Rutrum quisque non tellus orci ac auctor augue. Nunc vel risus commodo viverra maecenas accumsan lacus. Viverra vitae congue eu consequat. Sollicitudin nibh sit amet commodo nulla. Amet volutpat consequat mauris nunc congue nisi. Maecenas pharetra convallis posuere morbi leo urna molestie at. Mattis vulputate enim nulla aliquet porttitor lacus luctus accumsan tortor. Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc consequat. Adipiscing diam donec adipiscing tristique risus. Elementum curabitur vitae nunc sed velit dignissim sodales ut. Eleifend donec pretium vulputate sapien nec. Commodo quis imperdiet massa tincidunt nunc pulvinar. Proin libero nunc consequat interdum varius sit amet mattis. Facilisis gravida neque convallis a cras semper auctor neque vitae. Quisque egestas diam in arcu cursus. Nunc eget lorem dolor sed viverra ipsum. Mauris sit amet massa vitae tortor condimentum lacinia quis vel. Aliquam sem et tortor consequat id porta nibh venenatis cras. Nunc sed id semper risus in. Enim sed faucibus turpis in eu mi bibendum neque. Molestie nunc non blandit massa enim. Enim praesent elementum facilisis leo vel fringilla est ullamcorper. Semper risus in hendrerit gravida rutrum quisque non tellus orci. Ac turpis egestas maecenas pharetra. In nulla posuere sollicitudin aliquam. Justo nec ultrices dui sapien eget mi proin sed libero. In ornare quam viverra orci sagittis eu. Proin nibh nisl condimentum id venenatis. Morbi enim nunc faucibus a pellentesque sit amet porttitor eget. Quis risus sed vulputate odio ut enim blandit. Risus feugiat in ante metus dictum at tempor commodo. Sodales neque sodales ut etiam. Nunc id cursus metus aliquam. Gravida dictum fusce ut placerat orci nulla pellentesque dignissim enim. Augue ut lectus arcu bibendum at. Quis varius quam quisque id diam vel quam. Egestas congue quisque egestas diam in arcu. Condimentum mattis pellentesque id nibh tortor id aliquet lectus. Enim lobortis scelerisque fermentum dui faucibus in. In tellus integer feugiat scelerisque varius morbi enim nunc. Mattis molestie a iaculis at erat pellentesque. Elit scelerisque mauris pellentesque pulvinar pellentesque habitant morbi tristique. Lorem ipsum dolor sit amet consectetur adipiscing elit ut aliquam. Nisl rhoncus mattis rhoncus urna neque. Ac auctor augue mauris augue neque gravida in fermentum et. Sodales ut eu sem integer vitae justo eget. Sed egestas egestas fringilla phasellus. Viverra adipiscing at in tellus integer feugiat scelerisque varius. Purus gravida quis blandit turpis. Id porta nibh venenatis cras sed. Mattis vulputate enim nulla aliquet porttitor lacus. Augue eget arcu dictum varius duis at consectetur lorem donec. Nulla at volutpat diam ut venenatis tellus in metus. Aliquam etiam erat velit scelerisque in dictum non consectetur. Turpis cursus in hac habitasse platea dictumst. Consequat mauris nunc congue nisi vitae suscipit tellus. Volutpat maecenas volutpat blandit aliquam etiam. Massa massa ultricies mi quis hendrerit dolor magna eget est. Velit egestas dui id ornare arcu. Non consectetur a erat nam at. Orci sagittis eu volutpat odio facilisis mauris sit amet. Dui id ornare arcu odio. Sed arcu non odio euismod lacinia. Feugiat in ante metus dictum. Gravida arcu ac tortor dignissim convallis. Egestas sed tempus urna et pharetra pharetra massa massa. Nulla facilisi nullam vehicula ipsum a arcu. Ipsum a arcu cursus vitae congue mauris. Porttitor rhoncus dolor purus non. Magna sit amet purus gravida quis blandit. Sapien eget mi proin sed libero enim sed faucibus turpis. Nisl nunc mi ipsum faucibus vitae aliquet nec ullamcorper sit. Pellentesque dignissim enim sit amet venenatis urna cursus eget. Pharetra massa massa ultricies mi quis hendrerit. Sapien nec sagittis aliquam malesuada bibendum. Nunc scelerisque viverra mauris in aliquam sem fringilla ut. Dolor magna eget est lorem ipsum dolor. Amet commodo nulla facilisi nullam. Pellentesque elit ullamcorper dignissim cras. Id porta nibh venenatis cras sed felis eget. Nam at lectus urna duis. Laoreet non curabitur gravida arcu ac tortor dignissim convallis. Nunc lobortis mattis aliquam faucibus purus in massa tempor. Sit amet luctus venenatis lectus magna fringilla. Duis ultricies lacus sed turpis tincidunt id. Sed velit dignissim sodales ut eu. Ut tortor pretium viverra suspendisse potenti nullam. Iaculis at erat pellentesque adipiscing. Ipsum nunc aliquet bibendum enim facilisis gravida neque. Nulla aliquet enim tortor at auctor urna nunc id cursus. Amet cursus sit amet dictum sit amet justo donec enim. Enim nunc faucibus a pellentesque sit amet porttitor eget dolor. Pharetra magna ac placerat vestibulum lectus mauris ultrices eros in. Nulla facilisi etiam dignissim diam quis enim. Ut enim blandit volutpat maecenas volutpat blandit aliquam etiam erat. Imperdiet proin fermentum leo vel orci porta non pulvinar neque. Vel fringilla est ullamcorper eget nulla. Bibendum neque egestas congue quisque egestas diam in arcu cursus. Ipsum nunc aliquet bibendum enim facilisis gravida neque convallis a. Arcu cursus vitae congue mauris rhoncus aenean vel elit. Augue eget arcu dictum varius duis. Tristique et egestas quis ipsum. Quis varius quam quisque id. Varius sit amet mattis vulputate. Mattis molestie a iaculis at erat pellentesque. Libero justo laoreet sit amet cursus. Aliquam id diam maecenas ultricies mi eget mauris pharetra. Ut eu sem integer vitae justo eget. Fames ac turpis egestas sed. Suspendisse in est ante in nibh mauris cursus mattis. Faucibus pulvinar elementum integer enim neque volutpat ac tincidunt vitae. Neque vitae tempus quam pellentesque nec nam aliquam. Lobortis elementum nibh tellus molestie nunc non. Lacus vel facilisis volutpat est velit egestas dui. Justo laoreet sit amet cursus sit amet dictum sit amet. Adipiscing enim eu turpis egestas pretium aenean pharetra magna. Cursus metus aliquam eleifend mi in nulla posuere. Nibh mauris cursus mattis molestie a. Dignissim diam quis enim lobortis scelerisque fermentum. A scelerisque purus semper eget duis at tellus. Lacus sed turpis tincidunt id aliquet risus feugiat in. Non tellus orci ac auctor. Ultrices in iaculis nunc sed augue lacus. Tincidunt tortor aliquam nulla facilisi cras. Nulla facilisi nullam vehicula ipsum a arcu cursus vitae congue. Eget magna fermentum iaculis eu non diam phasellus. Pharetra massa massa ultricies mi quis. Eget mauris pharetra et ultrices neque ornare. Aliquam faucibus purus in massa. Facilisi morbi tempus iaculis urna id volutpat lacus. Accumsan lacus vel facilisis volutpat. Curabitur gravida arcu ac tortor. Quam lacus suspendisse faucibus interdum. Elementum nibh tellus molestie nunc non blandit massa enim. Libero id faucibus nisl tincidunt. Bibendum ut tristique et egestas. Ut diam quam nulla porttitor massa id neque aliquam vestibulum. Augue interdum velit euismod in pellentesque. Adipiscing diam donec adipiscing tristique risus nec feugiat. Fringilla ut morbi tincidunt augue interdum velit. Vitae et leo duis ut diam quam nulla porttitor massa. Egestas integer eget aliquet nibh praesent tristique. Posuere sollicitudin aliquam ultrices sagittis orci a. Nisi est sit amet facilisis. Risus quis varius quam quisque id diam. Faucibus turpis in eu mi. Et molestie ac feugiat sed lectus vestibulum. Porttitor lacus luctus accumsan tortor posuere ac. Platea dictumst vestibulum rhoncus est pellentesque. Tortor pretium viverra suspendisse potenti nullam ac tortor. Enim praesent elementum facilisis leo vel fringilla est. Proin libero nunc consequat interdum varius sit amet mattis vulputate. Turpis egestas pretium aenean pharetra magna ac placerat vestibulum lectus. Nulla pharetra diam sit amet nisl suscipit. Mauris nunc congue nisi vitae suscipit tellus mauris a diam. Faucibus in ornare quam viverra orci sagittis eu volutpat. Volutpat consequat mauris nunc congue nisi vitae. Dui nunc mattis enim ut tellus. Adipiscing elit ut aliquam purus sit amet luctus. Tempus egestas sed sed risus. Scelerisque fermentum dui faucibus in ornare quam viverra orci. Massa ultricies mi quis hendrerit dolor magna eget. Pulvinar mattis nunc sed blandit libero volutpat sed cras ornare. Ut eu sem integer vitae justo eget magna fermentum. Ornare quam viverra orci sagittis. Eget dolor morbi non arcu risus quis varius quam. Tincidunt praesent semper feugiat nibh sed pulvinar. Sit amet justo donec enim diam vulputate. Dui faucibus in ornare quam viverra. Tincidunt tortor aliquam nulla facilisi cras fermentum odio eu. Turpis egestas sed tempus urna et. Pretium quam vulputate dignissim suspendisse in est ante in. Morbi quis commodo odio aenean sed adipiscing diam donec. Nunc mattis enim ut tellus elementum sagittis vitae et. Diam vel quam elementum pulvinar etiam non quam. Convallis posuere morbi leo urna molestie at elementum eu. Adipiscing at in tellus integer feugiat scelerisque varius morbi. Quis varius quam quisque id diam vel quam elementum. Dui accumsan sit amet nulla. Adipiscing elit duis tristique sollicitudin nibh sit amet commodo. Viverra ipsum nunc aliquet bibendum enim facilisis. Porta lorem mollis aliquam ut. Velit ut tortor pretium viverra suspendisse potenti. Quis viverra nibh cras pulvinar mattis nunc sed blandit. Pharetra magna ac placerat vestibulum. Mauris ultrices eros in cursus turpis massa. Lacus vestibulum sed arcu non odio euismod lacinia at. Dapibus ultrices in iaculis nunc sed. Cras adipiscing enim eu turpis egestas. Eget arcu dictum varius duis at consectetur. Consequat id porta nibh venenatis cras sed felis eget velit. Integer enim neque volutpat ac tincidunt vitae. Feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Ut morbi tincidunt augue interdum velit euismod. Sed cras ornare arcu dui vivamus arcu felis bibendum ut. Eget felis eget nunc lobortis mattis aliquam faucibus purus in. Luctus venenatis lectus magna fringilla urna porttitor rhoncus dolor. Nisl nunc mi ipsum faucibus vitae. Proin fermentum leo vel orci porta. Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Et leo duis ut diam quam. Eros in cursus turpis massa tincidunt. Volutpat est velit egestas dui id. Commodo odio aenean sed adipiscing diam. Quis blandit turpis cursus in hac habitasse platea dictumst quisque. Magna fringilla urna porttitor rhoncus dolor. Amet consectetur adipiscing elit ut aliquam purus sit amet. Vitae justo eget magna fermentum iaculis eu non diam. Hendrerit dolor magna eget est. Ac placerat vestibulum lectus mauris ultrices eros in cursus turpis. Egestas diam in arcu cursus. At varius vel pharetra vel turpis nunc. Lacus vel facilisis volutpat est velit. Ut ornare lectus sit amet est placerat in egestas. Quam adipiscing vitae proin sagittis nisl rhoncus. Dolor purus non enim praesent. Urna condimentum mattis pellentesque id. Magnis dis parturient montes nascetur ridiculus. Feugiat nisl pretium fusce id. Sed cras ornare arcu dui vivamus. Vitae turpis massa sed elementum tempus egestas sed sed. Ac feugiat sed lectus vestibulum mattis ullamcorper velit sed ullamcorper. Ac ut consequat semper viverra nam libero. Consectetur lorem donec massa sapien faucibus. Purus viverra accumsan in nisl nisi scelerisque eu ultrices. Eu turpis egestas pretium aenean pharetra. Nisl rhoncus mattis rhoncus urna neque viverra justo nec ultrices. Pellentesque sit amet porttitor eget dolor morbi non arcu. Vitae justo eget magna fermentum iaculis. Quis auctor elit sed vulputate mi sit. Purus viverra accumsan in nisl nisi scelerisque eu ultrices. Semper auctor neque vitae tempus quam pellentesque nec nam. Rhoncus dolor purus non enim. Sed turpis tincidunt id aliquet risus feugiat. Sit amet justo donec enim diam vulputate ut pharetra sit. Risus pretium quam vulputate dignissim suspendisse in est ante in. Massa sapien faucibus et molestie ac feugiat. Id aliquet risus feugiat in ante metus. Risus ultricies tristique nulla aliquet enim tortor at auctor urna. Sed lectus vestibulum mattis ullamcorper velit sed ullamcorper morbi. Lacus sed turpis tincidunt id aliquet risus feugiat in. Risus ultricies tristique nulla aliquet enim tortor. In ornare quam viverra orci sagittis eu volutpat. Netus et malesuada fames ac turpis egestas sed tempus urna. Fames ac turpis egestas maecenas pharetra convallis posuere morbi. Etiam erat velit scelerisque in dictum non. Cursus turpis massa tincidunt dui ut ornare lectus. Tristique sollicitudin nibh sit amet commodo nulla facilisi. Pellentesque pulvinar pellentesque habitant morbi tristique senectus et. Aliquet eget sit amet tellus cras. Nullam ac tortor vitae purus faucibus ornare. Lacus viverra vitae congue eu consequat. Vulputate ut pharetra sit amet. Est ante in nibh mauris cursus mattis molestie a. Ipsum suspendisse ultrices gravida dictum fusce ut placerat orci. Et tortor at risus viverra. Sed libero enim sed faucibus turpis in eu. Id cursus metus aliquam eleifend mi in nulla posuere sollicitudin. Risus viverra adipiscing at in. Imperdiet massa tincidunt nunc pulvinar sapien et. Nec feugiat in fermentum posuere urna nec tincidunt. Ultricies mi eget mauris pharetra et. Morbi tristique senectus et netus et malesuada fames ac. At quis risus sed vulputate. Interdum velit laoreet id donec. Sapien pellentesque habitant morbi tristique. Pharetra vel turpis nunc eget lorem dolor sed viverra. In massa tempor nec feugiat nisl. Massa tincidunt nunc pulvinar sapien et ligula ullamcorper malesuada proin. Mauris augue neque gravida in. Faucibus vitae aliquet nec ullamcorper sit amet risus. Id velit ut tortor pretium viverra suspendisse potenti. Leo integer malesuada nunc vel risus commodo viverra maecenas. Risus quis varius quam quisque id. Aliquam malesuada bibendum arcu vitae elementum curabitur vitae. Vestibulum lectus mauris ultrices eros in cursus turpis. Fermentum posuere urna nec tincidunt. Magna etiam tempor orci eu lobortis elementum nibh tellus molestie. Id ornare arcu odio ut. Facilisi nullam vehicula ipsum a arcu cursus vitae congue. Nulla pellentesque dignissim enim sit amet venenatis urna cursus eget. Viverra mauris in aliquam sem fringilla ut morbi tincidunt. Quis ipsum suspendisse ultrices gravida dictum fusce ut placerat orci. Sed cras ornare arcu dui vivamus arcu felis. Egestas diam in arcu cursus euismod quis. Tincidunt dui ut ornare lectus. Morbi tristique senectus et netus et. Ornare arcu dui vivamus arcu felis bibendum ut tristique. Habitant morbi tristique senectus et netus et malesuada fames ac. Ut tristique et egestas quis. Mollis aliquam ut porttitor leo. Venenatis tellus in metus vulputate eu scelerisque felis imperdiet proin. Sagittis eu volutpat odio facilisis mauris sit amet massa. Eu facilisis sed odio morbi. Nunc consequat interdum varius sit amet mattis. Velit dignissim sodales ut eu. Pellentesque eu tincidunt tortor aliquam. Porta lorem mollis aliquam ut porttitor. Rhoncus urna neque viverra justo nec ultrices. Viverra suspendisse potenti nullam ac tortor vitae purus. Fermentum posuere urna nec tincidunt praesent semper feugiat nibh sed. Purus sit amet luctus venenatis lectus magna fringilla urna porttitor. Sed lectus vestibulum mattis ullamcorper velit sed ullamcorper. Nulla posuere sollicitudin aliquam ultrices sagittis orci a scelerisque. Nisl nisi scelerisque eu ultrices vitae auctor. In vitae turpis massa sed elementum tempus egestas. Cursus sit amet dictum sit amet justo donec enim. Vitae congue eu consequat ac felis donec et. Augue interdum velit euismod in pellentesque massa placerat. Enim ut sem viverra aliquet eget sit amet. Velit scelerisque in dictum non consectetur a erat. Sed lectus vestibulum mattis ullamcorper velit sed ullamcorper. Nunc faucibus a pellentesque sit amet porttitor eget. Tellus integer feugiat scelerisque varius morbi. Lorem sed risus ultricies tristique nulla aliquet enim tortor at. Eget nulla facilisi etiam dignissim diam quis enim lobortis scelerisque. Adipiscing elit duis tristique sollicitudin. Adipiscing elit pellentesque habitant morbi tristique. Ac tincidunt vitae semper quis lectus nulla at. Maecenas sed enim ut sem viverra. Erat pellentesque adipiscing commodo elit at imperdiet. Dolor morbi non arcu risus quis varius quam quisque. Fringilla urna porttitor rhoncus dolor purus non enim praesent. Tellus integer feugiat scelerisque varius morbi enim nunc faucibus a. Felis eget nunc lobortis mattis aliquam faucibus purus in. Fringilla phasellus faucibus scelerisque eleifend. Pulvinar etiam non quam lacus suspendisse faucibus interdum posuere. Risus ultricies tristique nulla aliquet. Lectus sit amet est placerat. Ac ut consequat semper viverra nam libero justo. Dapibus ultrices in iaculis nunc sed augue. Mattis ullamcorper velit sed ullamcorper. Eget nullam non nisi est. Vitae elementum curabitur vitae nunc sed velit. Sit amet commodo nulla facilisi nullam vehicula ipsum a arcu. Tempor nec feugiat nisl pretium fusce id velit ut. Nulla pellentesque dignissim enim sit amet venenatis. Sed tempus urna et pharetra pharetra. Congue quisque egestas diam in. Convallis posuere morbi leo urna. Nec tincidunt praesent semper feugiat nibh sed pulvinar proin gravida. Sagittis nisl rhoncus mattis rhoncus urna neque viverra justo. Scelerisque felis imperdiet proin fermentum leo vel. Ut placerat orci nulla pellentesque dignissim enim sit amet. In cursus turpis massa tincidunt dui. Rutrum quisque non tellus orci ac auctor augue mauris augue. Cursus vitae congue mauris rhoncus aenean vel elit scelerisque mauris. Scelerisque fermentum dui faucibus in ornare quam viverra orci. Habitant morbi tristique senectus et netus et. Ridiculus mus mauris vitae ultricies leo. Vitae semper quis lectus nulla at volutpat diam. Purus faucibus ornare suspendisse sed nisi. Enim lobortis scelerisque fermentum dui faucibus in ornare quam. Mi tempus imperdiet nulla malesuada pellentesque elit eget. Varius duis at consectetur lorem donec. Pulvinar pellentesque habitant morbi tristique senectus et netus et. A iaculis at erat pellentesque adipiscing commodo elit at imperdiet. Mi ipsum faucibus vitae aliquet nec. Libero volutpat sed cras ornare arcu dui vivamus arcu. Natoque penatibus et magnis dis parturient montes nascetur ridiculus. Maecenas volutpat blandit aliquam etiam erat velit scelerisque. Cras adipiscing enim eu turpis. Nec tincidunt praesent semper feugiat nibh sed pulvinar. Justo laoreet sit amet cursus sit amet dictum sit. Velit scelerisque in dictum non consectetur a erat nam. Turpis tincidunt id aliquet risus feugiat in ante. Aliquet risus feugiat in ante metus dictum. Hac habitasse platea dictumst quisque sagittis purus sit. Et pharetra pharetra massa massa ultricies. Sit amet nisl suscipit adipiscing bibendum est ultricies integer. Venenatis urna cursus eget nunc scelerisque viverra mauris in. Integer quis auctor elit sed. In est ante in nibh mauris cursus mattis molestie. Scelerisque in dictum non consectetur a erat nam at. Lectus sit amet est placerat in. Sit amet cursus sit amet. Nibh nisl condimentum id venenatis a condimentum. Purus ut faucibus pulvinar elementum integer enim. Pharetra sit amet aliquam id diam maecenas. Id cursus metus aliquam eleifend mi in nulla posuere. Lobortis mattis aliquam faucibus purus in massa tempor nec. Urna neque viverra justo nec ultrices dui sapien eget. Enim ut sem viverra aliquet eget sit amet. In eu mi bibendum neque egestas congue quisque egestas. Enim neque volutpat ac tincidunt. Orci ac auctor augue mauris augue neque gravida in fermentum. Velit aliquet sagittis id consectetur. Enim ut sem viverra aliquet eget sit amet tellus. Semper auctor neque vitae tempus quam pellentesque nec. Non blandit massa enim nec dui nunc. Morbi blandit cursus risus at ultrices mi tempus imperdiet nulla. Arcu non odio euismod lacinia at quis risus. Dictum varius duis at consectetur lorem donec massa. Blandit massa enim nec dui. Nibh ipsum consequat nisl vel. Turpis in eu mi bibendum neque. Ut tristique et egestas quis. Ac odio tempor orci dapibus. Gravida dictum fusce ut placerat orci nulla pellentesque dignissim. Integer feugiat scelerisque varius morbi enim. Libero volutpat sed cras ornare arcu dui. Odio aenean sed adipiscing diam. Et egestas quis ipsum suspendisse ultrices. Aliquet lectus proin nibh nisl condimentum. Sit amet consectetur adipiscing elit duis tristique sollicitudin nibh sit. Blandit massa enim nec dui. Tellus molestie nunc non blandit massa enim nec. Tortor vitae purus faucibus ornare suspendisse sed nisi. Nascetur ridiculus mus mauris vitae ultricies leo. Elementum facilisis leo vel fringilla est ullamcorper eget nulla. Diam maecenas ultricies mi eget. Duis tristique sollicitudin nibh sit amet commodo nulla. Tempus iaculis urna id volutpat lacus laoreet non curabitur gravida. Dictumst quisque sagittis purus sit amet. Viverra mauris in aliquam sem. Quis risus sed vulputate odio ut enim blandit volutpat maecenas. Condimentum mattis pellentesque id nibh tortor id. Non sodales neque sodales ut etiam sit amet. Ipsum consequat nisl vel pretium. Cursus in hac habitasse platea dictumst quisque sagittis purus sit. Fringilla est ullamcorper eget nulla facilisi etiam. Tellus elementum sagittis vitae et leo duis ut diam quam. Nisl vel pretium lectus quam id leo in.":
+ {"type":"string","value":"long"}}
diff --git a/tests/data/valid/toml-lang-compliance/valid/qa/qa-key-literal-40kb.toml b/tests/data/valid/toml-lang-compliance/valid/qa/qa-key-literal-40kb.toml
new file mode 100644
index 0000000..386629c
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/qa/qa-key-literal-40kb.toml
@@ -0,0 +1 @@
+'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Quam lacus suspendisse faucibus interdum posuere lorem ipsum dolor. Amet consectetur adipiscing elit ut. Nulla facilisi etiam dignissim diam quis enim lobortis. Curabitur vitae nunc sed velit dignissim sodales ut eu. Fames ac turpis egestas sed tempus urna et. Facilisi cras fermentum odio eu feugiat pretium. Nec tincidunt praesent semper feugiat nibh sed pulvinar proin gravida. Est lorem ipsum dolor sit amet consectetur adipiscing elit. Vel quam elementum pulvinar etiam non quam lacus. Pharetra et ultrices neque ornare aenean euismod. Nisl nisi scelerisque eu ultrices. Eget dolor morbi non arcu risus. Bibendum neque egestas congue quisque egestas diam in arcu cursus. Faucibus nisl tincidunt eget nullam. Nisl pretium fusce id velit ut tortor pretium viverra suspendisse. Mauris ultrices eros in cursus. Donec ac odio tempor orci dapibus ultrices in iaculis. Tellus cras adipiscing enim eu turpis egestas pretium aenean pharetra. Eros in cursus turpis massa. Nascetur ridiculus mus mauris vitae ultricies leo integer malesuada nunc. Velit sed ullamcorper morbi tincidunt ornare massa eget egestas purus. Aenean euismod elementum nisi quis eleifend quam. Magnis dis parturient montes nascetur ridiculus mus. Eu tincidunt tortor aliquam nulla facilisi cras. Tristique senectus et netus et malesuada fames. Urna nec tincidunt praesent semper feugiat nibh sed pulvinar. Vitae ultricies leo integer malesuada nunc vel risus commodo viverra. Ac turpis egestas sed tempus urna et. Amet mauris commodo quis imperdiet massa tincidunt. Urna nunc id cursus metus aliquam eleifend mi. In nulla posuere sollicitudin aliquam ultrices sagittis orci a scelerisque. Neque aliquam vestibulum morbi blandit cursus. Pulvinar mattis nunc sed blandit libero volutpat sed. Sed egestas egestas fringilla phasellus faucibus scelerisque eleifend donec pretium. Blandit cursus risus at ultrices mi tempus. Turpis massa sed elementum tempus egestas sed sed. Dictum varius duis at consectetur lorem. Commodo ullamcorper a lacus vestibulum sed arcu non. Dolor magna eget est lorem. Tincidunt arcu non sodales neque sodales ut etiam sit amet. Sit amet risus nullam eget felis eget nunc lobortis. Risus in hendrerit gravida rutrum quisque non tellus orci. Elementum pulvinar etiam non quam lacus suspendisse faucibus. Morbi tristique senectus et netus et malesuada. In aliquam sem fringilla ut morbi tincidunt. Ornare aenean euismod elementum nisi quis eleifend quam. Sed id semper risus in hendrerit gravida rutrum quisque. Lorem ipsum dolor sit amet consectetur adipiscing elit. A condimentum vitae sapien pellentesque habitant morbi tristique senectus et. Faucibus purus in massa tempor nec feugiat nisl. Vehicula ipsum a arcu cursus vitae congue. Facilisi cras fermentum odio eu feugiat pretium nibh. Viverra mauris in aliquam sem fringilla ut morbi tincidunt. Ultrices dui sapien eget mi proin sed libero enim. Nisi est sit amet facilisis magna etiam tempor. Posuere ac ut consequat semper viverra nam. Dis parturient montes nascetur ridiculus mus mauris vitae. Nec sagittis aliquam malesuada bibendum. Mattis pellentesque id nibh tortor id aliquet lectus. Vitae congue eu consequat ac felis donec et. Cras sed felis eget velit aliquet sagittis id consectetur purus. Pellentesque elit ullamcorper dignissim cras tincidunt. Pellentesque dignissim enim sit amet venenatis urna. A cras semper auctor neque vitae tempus. Amet massa vitae tortor condimentum lacinia quis vel eros donec. Tempor commodo ullamcorper a lacus. Nibh tellus molestie nunc non blandit massa enim nec dui. Viverra orci sagittis eu volutpat odio facilisis mauris sit. Sed augue lacus viverra vitae. Vulputate eu scelerisque felis imperdiet proin fermentum leo vel orci. Tellus rutrum tellus pellentesque eu tincidunt tortor. Cras semper auctor neque vitae tempus quam pellentesque nec. Lorem ipsum dolor sit amet consectetur adipiscing elit ut aliquam. Tristique magna sit amet purus gravida quis blandit turpis. Viverra ipsum nunc aliquet bibendum. Arcu bibendum at varius vel. Amet mattis vulputate enim nulla. Vulputate enim nulla aliquet porttitor. Volutpat blandit aliquam etiam erat velit scelerisque in dictum. Morbi tristique senectus et netus et malesuada fames ac. Faucibus et molestie ac feugiat sed. Tellus elementum sagittis vitae et leo duis. Id aliquet lectus proin nibh. Ornare arcu dui vivamus arcu. Morbi tincidunt augue interdum velit euismod in pellentesque massa placerat. Quis eleifend quam adipiscing vitae. Tristique senectus et netus et malesuada fames ac turpis. Pharetra convallis posuere morbi leo. Ornare arcu odio ut sem nulla pharetra diam sit. Morbi tristique senectus et netus et. Dictum non consectetur a erat nam at lectus urna. Varius vel pharetra vel turpis. Mi ipsum faucibus vitae aliquet. Tellus in metus vulputate eu scelerisque felis imperdiet proin. In est ante in nibh mauris cursus mattis. Massa ultricies mi quis hendrerit dolor magna eget. Fermentum leo vel orci porta. Elit ut aliquam purus sit amet luctus venenatis lectus. Eget aliquet nibh praesent tristique magna sit amet. Arcu non odio euismod lacinia at quis. Montes nascetur ridiculus mus mauris vitae ultricies. Tempus quam pellentesque nec nam aliquam sem et tortor. Morbi leo urna molestie at elementum eu facilisis sed. In fermentum posuere urna nec tincidunt. Neque aliquam vestibulum morbi blandit cursus risus. Vulputate dignissim suspendisse in est ante in nibh mauris cursus. Lorem ipsum dolor sit amet consectetur adipiscing. Orci eu lobortis elementum nibh tellus molestie nunc non. Enim diam vulputate ut pharetra sit amet aliquam. Convallis convallis tellus id interdum velit laoreet id donec ultrices. Sit amet mattis vulputate enim nulla aliquet porttitor lacus luctus. A lacus vestibulum sed arcu non odio. Ut tortor pretium viverra suspendisse potenti nullam ac tortor. Diam vel quam elementum pulvinar etiam non quam. Viverra justo nec ultrices dui. Eu volutpat odio facilisis mauris sit amet massa. Sed ullamcorper morbi tincidunt ornare massa eget egestas purus. Ac felis donec et odio pellentesque. Nisl vel pretium lectus quam id leo in. Ultricies lacus sed turpis tincidunt id. At urna condimentum mattis pellentesque id nibh tortor id. Sem nulla pharetra diam sit amet nisl suscipit. Neque viverra justo nec ultrices. Arcu cursus euismod quis viverra nibh cras pulvinar. Dolor sit amet consectetur adipiscing elit ut aliquam purus. Id diam vel quam elementum pulvinar etiam non. Elementum pulvinar etiam non quam lacus suspendisse faucibus. Id aliquet lectus proin nibh nisl condimentum id venenatis. Sit amet consectetur adipiscing elit duis tristique sollicitudin nibh. Sed faucibus turpis in eu mi bibendum neque egestas congue. Consectetur libero id faucibus nisl tincidunt eget nullam. At volutpat diam ut venenatis tellus in metus vulputate eu. Condimentum lacinia quis vel eros donec ac odio. Sit amet porttitor eget dolor morbi non arcu risus quis. Viverra mauris in aliquam sem fringilla ut morbi tincidunt. Metus dictum at tempor commodo ullamcorper. At ultrices mi tempus imperdiet nulla. Est ullamcorper eget nulla facilisi etiam dignissim diam quis. Lobortis elementum nibh tellus molestie nunc non. Placerat in egestas erat imperdiet sed. Placerat in egestas erat imperdiet sed euismod. Lobortis feugiat vivamus at augue eget arcu dictum varius. Ut sem nulla pharetra diam sit amet. Et tortor at risus viverra adipiscing at in. Tempor nec feugiat nisl pretium. Cursus euismod quis viverra nibh. Eget mi proin sed libero enim sed. Aliquam id diam maecenas ultricies. Mi tempus imperdiet nulla malesuada pellentesque elit eget. Gravida quis blandit turpis cursus in hac habitasse platea dictumst. Sed tempus urna et pharetra pharetra massa massa. Dolor purus non enim praesent elementum facilisis leo vel. Pharetra vel turpis nunc eget. Quam pellentesque nec nam aliquam sem et tortor consequat id. Orci eu lobortis elementum nibh tellus molestie nunc non. Porttitor leo a diam sollicitudin tempor id. Tincidunt ornare massa eget egestas purus viverra accumsan in nisl. Quam lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Elit ut aliquam purus sit amet luctus venenatis lectus. Velit egestas dui id ornare arcu odio ut sem nulla. Lacus viverra vitae congue eu consequat ac felis donec. Nulla aliquet porttitor lacus luctus accumsan tortor posuere ac ut. Lorem dolor sed viverra ipsum. Blandit libero volutpat sed cras ornare arcu. Egestas erat imperdiet sed euismod nisi porta lorem mollis. Viverra maecenas accumsan lacus vel. Enim neque volutpat ac tincidunt. Porttitor massa id neque aliquam vestibulum morbi blandit cursus risus. Malesuada bibendum arcu vitae elementum curabitur vitae nunc. Et malesuada fames ac turpis egestas integer. Egestas egestas fringilla phasellus faucibus scelerisque eleifend donec pretium. Est placerat in egestas erat imperdiet sed. Non arcu risus quis varius quam quisque. Lorem mollis aliquam ut porttitor leo a. Viverra tellus in hac habitasse platea dictumst vestibulum rhoncus. Fermentum iaculis eu non diam. Erat imperdiet sed euismod nisi porta lorem mollis aliquam. Varius vel pharetra vel turpis nunc eget lorem dolor. Rhoncus mattis rhoncus urna neque viverra. Hac habitasse platea dictumst quisque sagittis purus sit. At quis risus sed vulputate odio ut enim. Pharetra magna ac placerat vestibulum lectus mauris ultrices eros. Rutrum quisque non tellus orci ac auctor. Iaculis eu non diam phasellus vestibulum lorem sed. Ut sem nulla pharetra diam sit amet nisl suscipit. Risus at ultrices mi tempus. Vitae tortor condimentum lacinia quis vel eros donec. Sed tempus urna et pharetra. Posuere sollicitudin aliquam ultrices sagittis orci. Congue quisque egestas diam in arcu. Hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Pellentesque habitant morbi tristique senectus et netus et. Id interdum velit laoreet id. Fusce ut placerat orci nulla pellentesque dignissim. Pretium nibh ipsum consequat nisl vel pretium. Etiam erat velit scelerisque in dictum non consectetur a. Turpis in eu mi bibendum neque egestas congue quisque egestas. Pulvinar sapien et ligula ullamcorper malesuada. Ultricies tristique nulla aliquet enim tortor at. Suspendisse interdum consectetur libero id faucibus. Lorem sed risus ultricies tristique nulla aliquet. Tristique senectus et netus et malesuada fames. Eu augue ut lectus arcu bibendum at varius vel. Egestas sed tempus urna et pharetra pharetra massa massa ultricies. Aliquet eget sit amet tellus cras adipiscing. Massa placerat duis ultricies lacus sed turpis tincidunt id aliquet. Ornare massa eget egestas purus viverra accumsan in nisl. Justo laoreet sit amet cursus sit amet. In metus vulputate eu scelerisque felis imperdiet proin. At erat pellentesque adipiscing commodo elit at. Ipsum suspendisse ultrices gravida dictum fusce. Lectus sit amet est placerat in egestas erat. Aliquam ultrices sagittis orci a. Sagittis id consectetur purus ut faucibus pulvinar elementum. Ornare arcu odio ut sem nulla pharetra diam. Sit amet purus gravida quis blandit turpis cursus. Duis ultricies lacus sed turpis tincidunt. Malesuada fames ac turpis egestas sed tempus urna et. Viverra ipsum nunc aliquet bibendum enim facilisis. Et pharetra pharetra massa massa ultricies mi quis. Eget duis at tellus at urna condimentum mattis. Euismod in pellentesque massa placerat. Enim nunc faucibus a pellentesque sit amet porttitor. Dolor sed viverra ipsum nunc aliquet. Donec enim diam vulputate ut pharetra sit amet. Feugiat sed lectus vestibulum mattis ullamcorper velit sed. Erat pellentesque adipiscing commodo elit at imperdiet. Nisl purus in mollis nunc sed id semper risus. Tincidunt augue interdum velit euismod in pellentesque massa. Facilisis magna etiam tempor orci. Mauris in aliquam sem fringilla ut. Gravida dictum fusce ut placerat orci. Sed risus ultricies tristique nulla. Odio morbi quis commodo odio. Feugiat in ante metus dictum at tempor commodo ullamcorper. Porta non pulvinar neque laoreet suspendisse interdum. Etiam tempor orci eu lobortis elementum. Fusce ut placerat orci nulla pellentesque dignissim. Ornare lectus sit amet est placerat in egestas erat. Quis vel eros donec ac. Elementum pulvinar etiam non quam lacus. Sit amet tellus cras adipiscing enim eu turpis. Amet tellus cras adipiscing enim eu. Sed faucibus turpis in eu mi bibendum. Lectus proin nibh nisl condimentum id. Sollicitudin nibh sit amet commodo nulla. Sed tempus urna et pharetra pharetra massa massa. Magna eget est lorem ipsum. Elit ullamcorper dignissim cras tincidunt lobortis feugiat vivamus at. Fermentum dui faucibus in ornare quam viverra orci sagittis eu. Dignissim convallis aenean et tortor. Ut faucibus pulvinar elementum integer enim neque. Nibh cras pulvinar mattis nunc sed. Pellentesque sit amet porttitor eget dolor morbi. Mi eget mauris pharetra et ultrices neque ornare aenean euismod. Quis risus sed vulputate odio ut enim blandit volutpat. Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. In vitae turpis massa sed elementum tempus egestas sed sed. Urna id volutpat lacus laoreet non. Egestas pretium aenean pharetra magna ac placerat. Amet commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Donec et odio pellentesque diam volutpat commodo sed. Etiam non quam lacus suspendisse. Augue neque gravida in fermentum et sollicitudin ac orci. Eu feugiat pretium nibh ipsum. Nam at lectus urna duis convallis convallis tellus id. Egestas integer eget aliquet nibh. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae auctor. Urna condimentum mattis pellentesque id nibh tortor id. In egestas erat imperdiet sed euismod. Ut sem viverra aliquet eget sit amet tellus. Feugiat pretium nibh ipsum consequat nisl vel pretium. Volutpat odio facilisis mauris sit amet. Mi sit amet mauris commodo quis imperdiet massa tincidunt. Neque volutpat ac tincidunt vitae semper quis lectus nulla at. Nec feugiat in fermentum posuere urna nec. Ut venenatis tellus in metus vulputate eu. Vestibulum rhoncus est pellentesque elit ullamcorper dignissim. Eu scelerisque felis imperdiet proin. Vitae et leo duis ut diam quam nulla. Ut venenatis tellus in metus vulputate eu scelerisque. Tincidunt dui ut ornare lectus sit amet. Adipiscing diam donec adipiscing tristique risus. Turpis nunc eget lorem dolor sed viverra ipsum nunc aliquet. Non sodales neque sodales ut. Massa placerat duis ultricies lacus sed turpis tincidunt. Viverra orci sagittis eu volutpat odio facilisis mauris sit amet. Adipiscing vitae proin sagittis nisl. Vitae aliquet nec ullamcorper sit. Potenti nullam ac tortor vitae purus. Ultricies lacus sed turpis tincidunt id. Ut diam quam nulla porttitor massa id neque aliquam vestibulum. Semper eget duis at tellus at urna condimentum mattis pellentesque. Nec tincidunt praesent semper feugiat nibh sed pulvinar proin. Dictum fusce ut placerat orci nulla pellentesque dignissim. Amet luctus venenatis lectus magna fringilla urna. Quam quisque id diam vel quam elementum pulvinar. At tempor commodo ullamcorper a. Magna etiam tempor orci eu lobortis. Suspendisse ultrices gravida dictum fusce. Massa ultricies mi quis hendrerit dolor magna. Massa tincidunt nunc pulvinar sapien et ligula ullamcorper malesuada proin. Aliquet enim tortor at auctor urna nunc id. Semper feugiat nibh sed pulvinar proin gravida. Porttitor rhoncus dolor purus non enim. Metus aliquam eleifend mi in nulla. Lectus arcu bibendum at varius vel pharetra. Sed vulputate odio ut enim blandit volutpat. Et ligula ullamcorper malesuada proin libero nunc consequat interdum varius. Donec et odio pellentesque diam volutpat commodo. Id ornare arcu odio ut sem nulla pharetra diam sit. Est ullamcorper eget nulla facilisi etiam dignissim diam quis enim. Sagittis vitae et leo duis ut diam quam nulla. Elementum nisi quis eleifend quam. Congue mauris rhoncus aenean vel elit. Adipiscing elit duis tristique sollicitudin nibh sit. Egestas egestas fringilla phasellus faucibus scelerisque. Morbi tincidunt augue interdum velit euismod. Massa sed elementum tempus egestas sed sed. Id leo in vitae turpis massa sed elementum tempus egestas. In pellentesque massa placerat duis ultricies lacus sed turpis. Vitae proin sagittis nisl rhoncus mattis rhoncus. Enim tortor at auctor urna nunc id. In fermentum posuere urna nec tincidunt praesent semper feugiat nibh. Aliquam ut porttitor leo a diam sollicitudin tempor id. Pellentesque elit eget gravida cum sociis natoque. Molestie at elementum eu facilisis sed odio morbi quis. Tristique senectus et netus et malesuada fames ac turpis. Proin libero nunc consequat interdum varius sit amet mattis. Pellentesque id nibh tortor id. Risus sed vulputate odio ut enim blandit. Laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt eget. Morbi tincidunt augue interdum velit euismod in pellentesque. Pharetra pharetra massa massa ultricies mi quis hendrerit. Nunc aliquet bibendum enim facilisis gravida neque. Feugiat sed lectus vestibulum mattis ullamcorper velit sed ullamcorper. Risus quis varius quam quisque id diam vel. Et ultrices neque ornare aenean. Aliquet sagittis id consectetur purus ut faucibus pulvinar elementum. Nibh ipsum consequat nisl vel. Mauris rhoncus aenean vel elit scelerisque mauris pellentesque pulvinar. Ornare quam viverra orci sagittis eu volutpat odio facilisis. Euismod nisi porta lorem mollis aliquam. Enim ut tellus elementum sagittis. Rhoncus mattis rhoncus urna neque. Malesuada fames ac turpis egestas. Cursus in hac habitasse platea dictumst quisque sagittis. Sit amet aliquam id diam maecenas ultricies mi eget mauris. Enim sit amet venenatis urna cursus eget nunc. Fermentum odio eu feugiat pretium nibh ipsum consequat. Eu scelerisque felis imperdiet proin. Nullam non nisi est sit amet facilisis magna etiam tempor. In mollis nunc sed id semper risus in hendrerit. Sollicitudin nibh sit amet commodo nulla facilisi nullam. Sit amet nisl purus in mollis nunc sed id. Nam libero justo laoreet sit amet cursus sit amet dictum. Condimentum id venenatis a condimentum vitae sapien pellentesque. Porta nibh venenatis cras sed felis. Lectus nulla at volutpat diam ut venenatis tellus in. Aliquam etiam erat velit scelerisque in dictum non consectetur a. Leo vel fringilla est ullamcorper eget. Sodales ut etiam sit amet nisl purus in mollis nunc. Euismod nisi porta lorem mollis aliquam. Ornare arcu odio ut sem nulla. Sed felis eget velit aliquet sagittis id consectetur. Pellentesque nec nam aliquam sem et tortor consequat id. Enim nec dui nunc mattis enim ut tellus elementum. Nullam non nisi est sit amet facilisis magna. Rutrum quisque non tellus orci ac auctor augue. Nunc vel risus commodo viverra maecenas accumsan lacus. Viverra vitae congue eu consequat. Sollicitudin nibh sit amet commodo nulla. Amet volutpat consequat mauris nunc congue nisi. Maecenas pharetra convallis posuere morbi leo urna molestie at. Mattis vulputate enim nulla aliquet porttitor lacus luctus accumsan tortor. Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc consequat. Adipiscing diam donec adipiscing tristique risus. Elementum curabitur vitae nunc sed velit dignissim sodales ut. Eleifend donec pretium vulputate sapien nec. Commodo quis imperdiet massa tincidunt nunc pulvinar. Proin libero nunc consequat interdum varius sit amet mattis. Facilisis gravida neque convallis a cras semper auctor neque vitae. Quisque egestas diam in arcu cursus. Nunc eget lorem dolor sed viverra ipsum. Mauris sit amet massa vitae tortor condimentum lacinia quis vel. Aliquam sem et tortor consequat id porta nibh venenatis cras. Nunc sed id semper risus in. Enim sed faucibus turpis in eu mi bibendum neque. Molestie nunc non blandit massa enim. Enim praesent elementum facilisis leo vel fringilla est ullamcorper. Semper risus in hendrerit gravida rutrum quisque non tellus orci. Ac turpis egestas maecenas pharetra. In nulla posuere sollicitudin aliquam. Justo nec ultrices dui sapien eget mi proin sed libero. In ornare quam viverra orci sagittis eu. Proin nibh nisl condimentum id venenatis. Morbi enim nunc faucibus a pellentesque sit amet porttitor eget. Quis risus sed vulputate odio ut enim blandit. Risus feugiat in ante metus dictum at tempor commodo. Sodales neque sodales ut etiam. Nunc id cursus metus aliquam. Gravida dictum fusce ut placerat orci nulla pellentesque dignissim enim. Augue ut lectus arcu bibendum at. Quis varius quam quisque id diam vel quam. Egestas congue quisque egestas diam in arcu. Condimentum mattis pellentesque id nibh tortor id aliquet lectus. Enim lobortis scelerisque fermentum dui faucibus in. In tellus integer feugiat scelerisque varius morbi enim nunc. Mattis molestie a iaculis at erat pellentesque. Elit scelerisque mauris pellentesque pulvinar pellentesque habitant morbi tristique. Lorem ipsum dolor sit amet consectetur adipiscing elit ut aliquam. Nisl rhoncus mattis rhoncus urna neque. Ac auctor augue mauris augue neque gravida in fermentum et. Sodales ut eu sem integer vitae justo eget. Sed egestas egestas fringilla phasellus. Viverra adipiscing at in tellus integer feugiat scelerisque varius. Purus gravida quis blandit turpis. Id porta nibh venenatis cras sed. Mattis vulputate enim nulla aliquet porttitor lacus. Augue eget arcu dictum varius duis at consectetur lorem donec. Nulla at volutpat diam ut venenatis tellus in metus. Aliquam etiam erat velit scelerisque in dictum non consectetur. Turpis cursus in hac habitasse platea dictumst. Consequat mauris nunc congue nisi vitae suscipit tellus. Volutpat maecenas volutpat blandit aliquam etiam. Massa massa ultricies mi quis hendrerit dolor magna eget est. Velit egestas dui id ornare arcu. Non consectetur a erat nam at. Orci sagittis eu volutpat odio facilisis mauris sit amet. Dui id ornare arcu odio. Sed arcu non odio euismod lacinia. Feugiat in ante metus dictum. Gravida arcu ac tortor dignissim convallis. Egestas sed tempus urna et pharetra pharetra massa massa. Nulla facilisi nullam vehicula ipsum a arcu. Ipsum a arcu cursus vitae congue mauris. Porttitor rhoncus dolor purus non. Magna sit amet purus gravida quis blandit. Sapien eget mi proin sed libero enim sed faucibus turpis. Nisl nunc mi ipsum faucibus vitae aliquet nec ullamcorper sit. Pellentesque dignissim enim sit amet venenatis urna cursus eget. Pharetra massa massa ultricies mi quis hendrerit. Sapien nec sagittis aliquam malesuada bibendum. Nunc scelerisque viverra mauris in aliquam sem fringilla ut. Dolor magna eget est lorem ipsum dolor. Amet commodo nulla facilisi nullam. Pellentesque elit ullamcorper dignissim cras. Id porta nibh venenatis cras sed felis eget. Nam at lectus urna duis. Laoreet non curabitur gravida arcu ac tortor dignissim convallis. Nunc lobortis mattis aliquam faucibus purus in massa tempor. Sit amet luctus venenatis lectus magna fringilla. Duis ultricies lacus sed turpis tincidunt id. Sed velit dignissim sodales ut eu. Ut tortor pretium viverra suspendisse potenti nullam. Iaculis at erat pellentesque adipiscing. Ipsum nunc aliquet bibendum enim facilisis gravida neque. Nulla aliquet enim tortor at auctor urna nunc id cursus. Amet cursus sit amet dictum sit amet justo donec enim. Enim nunc faucibus a pellentesque sit amet porttitor eget dolor. Pharetra magna ac placerat vestibulum lectus mauris ultrices eros in. Nulla facilisi etiam dignissim diam quis enim. Ut enim blandit volutpat maecenas volutpat blandit aliquam etiam erat. Imperdiet proin fermentum leo vel orci porta non pulvinar neque. Vel fringilla est ullamcorper eget nulla. Bibendum neque egestas congue quisque egestas diam in arcu cursus. Ipsum nunc aliquet bibendum enim facilisis gravida neque convallis a. Arcu cursus vitae congue mauris rhoncus aenean vel elit. Augue eget arcu dictum varius duis. Tristique et egestas quis ipsum. Quis varius quam quisque id. Varius sit amet mattis vulputate. Mattis molestie a iaculis at erat pellentesque. Libero justo laoreet sit amet cursus. Aliquam id diam maecenas ultricies mi eget mauris pharetra. Ut eu sem integer vitae justo eget. Fames ac turpis egestas sed. Suspendisse in est ante in nibh mauris cursus mattis. Faucibus pulvinar elementum integer enim neque volutpat ac tincidunt vitae. Neque vitae tempus quam pellentesque nec nam aliquam. Lobortis elementum nibh tellus molestie nunc non. Lacus vel facilisis volutpat est velit egestas dui. Justo laoreet sit amet cursus sit amet dictum sit amet. Adipiscing enim eu turpis egestas pretium aenean pharetra magna. Cursus metus aliquam eleifend mi in nulla posuere. Nibh mauris cursus mattis molestie a. Dignissim diam quis enim lobortis scelerisque fermentum. A scelerisque purus semper eget duis at tellus. Lacus sed turpis tincidunt id aliquet risus feugiat in. Non tellus orci ac auctor. Ultrices in iaculis nunc sed augue lacus. Tincidunt tortor aliquam nulla facilisi cras. Nulla facilisi nullam vehicula ipsum a arcu cursus vitae congue. Eget magna fermentum iaculis eu non diam phasellus. Pharetra massa massa ultricies mi quis. Eget mauris pharetra et ultrices neque ornare. Aliquam faucibus purus in massa. Facilisi morbi tempus iaculis urna id volutpat lacus. Accumsan lacus vel facilisis volutpat. Curabitur gravida arcu ac tortor. Quam lacus suspendisse faucibus interdum. Elementum nibh tellus molestie nunc non blandit massa enim. Libero id faucibus nisl tincidunt. Bibendum ut tristique et egestas. Ut diam quam nulla porttitor massa id neque aliquam vestibulum. Augue interdum velit euismod in pellentesque. Adipiscing diam donec adipiscing tristique risus nec feugiat. Fringilla ut morbi tincidunt augue interdum velit. Vitae et leo duis ut diam quam nulla porttitor massa. Egestas integer eget aliquet nibh praesent tristique. Posuere sollicitudin aliquam ultrices sagittis orci a. Nisi est sit amet facilisis. Risus quis varius quam quisque id diam. Faucibus turpis in eu mi. Et molestie ac feugiat sed lectus vestibulum. Porttitor lacus luctus accumsan tortor posuere ac. Platea dictumst vestibulum rhoncus est pellentesque. Tortor pretium viverra suspendisse potenti nullam ac tortor. Enim praesent elementum facilisis leo vel fringilla est. Proin libero nunc consequat interdum varius sit amet mattis vulputate. Turpis egestas pretium aenean pharetra magna ac placerat vestibulum lectus. Nulla pharetra diam sit amet nisl suscipit. Mauris nunc congue nisi vitae suscipit tellus mauris a diam. Faucibus in ornare quam viverra orci sagittis eu volutpat. Volutpat consequat mauris nunc congue nisi vitae. Dui nunc mattis enim ut tellus. Adipiscing elit ut aliquam purus sit amet luctus. Tempus egestas sed sed risus. Scelerisque fermentum dui faucibus in ornare quam viverra orci. Massa ultricies mi quis hendrerit dolor magna eget. Pulvinar mattis nunc sed blandit libero volutpat sed cras ornare. Ut eu sem integer vitae justo eget magna fermentum. Ornare quam viverra orci sagittis. Eget dolor morbi non arcu risus quis varius quam. Tincidunt praesent semper feugiat nibh sed pulvinar. Sit amet justo donec enim diam vulputate. Dui faucibus in ornare quam viverra. Tincidunt tortor aliquam nulla facilisi cras fermentum odio eu. Turpis egestas sed tempus urna et. Pretium quam vulputate dignissim suspendisse in est ante in. Morbi quis commodo odio aenean sed adipiscing diam donec. Nunc mattis enim ut tellus elementum sagittis vitae et. Diam vel quam elementum pulvinar etiam non quam. Convallis posuere morbi leo urna molestie at elementum eu. Adipiscing at in tellus integer feugiat scelerisque varius morbi. Quis varius quam quisque id diam vel quam elementum. Dui accumsan sit amet nulla. Adipiscing elit duis tristique sollicitudin nibh sit amet commodo. Viverra ipsum nunc aliquet bibendum enim facilisis. Porta lorem mollis aliquam ut. Velit ut tortor pretium viverra suspendisse potenti. Quis viverra nibh cras pulvinar mattis nunc sed blandit. Pharetra magna ac placerat vestibulum. Mauris ultrices eros in cursus turpis massa. Lacus vestibulum sed arcu non odio euismod lacinia at. Dapibus ultrices in iaculis nunc sed. Cras adipiscing enim eu turpis egestas. Eget arcu dictum varius duis at consectetur. Consequat id porta nibh venenatis cras sed felis eget velit. Integer enim neque volutpat ac tincidunt vitae. Feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Ut morbi tincidunt augue interdum velit euismod. Sed cras ornare arcu dui vivamus arcu felis bibendum ut. Eget felis eget nunc lobortis mattis aliquam faucibus purus in. Luctus venenatis lectus magna fringilla urna porttitor rhoncus dolor. Nisl nunc mi ipsum faucibus vitae. Proin fermentum leo vel orci porta. Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Et leo duis ut diam quam. Eros in cursus turpis massa tincidunt. Volutpat est velit egestas dui id. Commodo odio aenean sed adipiscing diam. Quis blandit turpis cursus in hac habitasse platea dictumst quisque. Magna fringilla urna porttitor rhoncus dolor. Amet consectetur adipiscing elit ut aliquam purus sit amet. Vitae justo eget magna fermentum iaculis eu non diam. Hendrerit dolor magna eget est. Ac placerat vestibulum lectus mauris ultrices eros in cursus turpis. Egestas diam in arcu cursus. At varius vel pharetra vel turpis nunc. Lacus vel facilisis volutpat est velit. Ut ornare lectus sit amet est placerat in egestas. Quam adipiscing vitae proin sagittis nisl rhoncus. Dolor purus non enim praesent. Urna condimentum mattis pellentesque id. Magnis dis parturient montes nascetur ridiculus. Feugiat nisl pretium fusce id. Sed cras ornare arcu dui vivamus. Vitae turpis massa sed elementum tempus egestas sed sed. Ac feugiat sed lectus vestibulum mattis ullamcorper velit sed ullamcorper. Ac ut consequat semper viverra nam libero. Consectetur lorem donec massa sapien faucibus. Purus viverra accumsan in nisl nisi scelerisque eu ultrices. Eu turpis egestas pretium aenean pharetra. Nisl rhoncus mattis rhoncus urna neque viverra justo nec ultrices. Pellentesque sit amet porttitor eget dolor morbi non arcu. Vitae justo eget magna fermentum iaculis. Quis auctor elit sed vulputate mi sit. Purus viverra accumsan in nisl nisi scelerisque eu ultrices. Semper auctor neque vitae tempus quam pellentesque nec nam. Rhoncus dolor purus non enim. Sed turpis tincidunt id aliquet risus feugiat. Sit amet justo donec enim diam vulputate ut pharetra sit. Risus pretium quam vulputate dignissim suspendisse in est ante in. Massa sapien faucibus et molestie ac feugiat. Id aliquet risus feugiat in ante metus. Risus ultricies tristique nulla aliquet enim tortor at auctor urna. Sed lectus vestibulum mattis ullamcorper velit sed ullamcorper morbi. Lacus sed turpis tincidunt id aliquet risus feugiat in. Risus ultricies tristique nulla aliquet enim tortor. In ornare quam viverra orci sagittis eu volutpat. Netus et malesuada fames ac turpis egestas sed tempus urna. Fames ac turpis egestas maecenas pharetra convallis posuere morbi. Etiam erat velit scelerisque in dictum non. Cursus turpis massa tincidunt dui ut ornare lectus. Tristique sollicitudin nibh sit amet commodo nulla facilisi. Pellentesque pulvinar pellentesque habitant morbi tristique senectus et. Aliquet eget sit amet tellus cras. Nullam ac tortor vitae purus faucibus ornare. Lacus viverra vitae congue eu consequat. Vulputate ut pharetra sit amet. Est ante in nibh mauris cursus mattis molestie a. Ipsum suspendisse ultrices gravida dictum fusce ut placerat orci. Et tortor at risus viverra. Sed libero enim sed faucibus turpis in eu. Id cursus metus aliquam eleifend mi in nulla posuere sollicitudin. Risus viverra adipiscing at in. Imperdiet massa tincidunt nunc pulvinar sapien et. Nec feugiat in fermentum posuere urna nec tincidunt. Ultricies mi eget mauris pharetra et. Morbi tristique senectus et netus et malesuada fames ac. At quis risus sed vulputate. Interdum velit laoreet id donec. Sapien pellentesque habitant morbi tristique. Pharetra vel turpis nunc eget lorem dolor sed viverra. In massa tempor nec feugiat nisl. Massa tincidunt nunc pulvinar sapien et ligula ullamcorper malesuada proin. Mauris augue neque gravida in. Faucibus vitae aliquet nec ullamcorper sit amet risus. Id velit ut tortor pretium viverra suspendisse potenti. Leo integer malesuada nunc vel risus commodo viverra maecenas. Risus quis varius quam quisque id. Aliquam malesuada bibendum arcu vitae elementum curabitur vitae. Vestibulum lectus mauris ultrices eros in cursus turpis. Fermentum posuere urna nec tincidunt. Magna etiam tempor orci eu lobortis elementum nibh tellus molestie. Id ornare arcu odio ut. Facilisi nullam vehicula ipsum a arcu cursus vitae congue. Nulla pellentesque dignissim enim sit amet venenatis urna cursus eget. Viverra mauris in aliquam sem fringilla ut morbi tincidunt. Quis ipsum suspendisse ultrices gravida dictum fusce ut placerat orci. Sed cras ornare arcu dui vivamus arcu felis. Egestas diam in arcu cursus euismod quis. Tincidunt dui ut ornare lectus. Morbi tristique senectus et netus et. Ornare arcu dui vivamus arcu felis bibendum ut tristique. Habitant morbi tristique senectus et netus et malesuada fames ac. Ut tristique et egestas quis. Mollis aliquam ut porttitor leo. Venenatis tellus in metus vulputate eu scelerisque felis imperdiet proin. Sagittis eu volutpat odio facilisis mauris sit amet massa. Eu facilisis sed odio morbi. Nunc consequat interdum varius sit amet mattis. Velit dignissim sodales ut eu. Pellentesque eu tincidunt tortor aliquam. Porta lorem mollis aliquam ut porttitor. Rhoncus urna neque viverra justo nec ultrices. Viverra suspendisse potenti nullam ac tortor vitae purus. Fermentum posuere urna nec tincidunt praesent semper feugiat nibh sed. Purus sit amet luctus venenatis lectus magna fringilla urna porttitor. Sed lectus vestibulum mattis ullamcorper velit sed ullamcorper. Nulla posuere sollicitudin aliquam ultrices sagittis orci a scelerisque. Nisl nisi scelerisque eu ultrices vitae auctor. In vitae turpis massa sed elementum tempus egestas. Cursus sit amet dictum sit amet justo donec enim. Vitae congue eu consequat ac felis donec et. Augue interdum velit euismod in pellentesque massa placerat. Enim ut sem viverra aliquet eget sit amet. Velit scelerisque in dictum non consectetur a erat. Sed lectus vestibulum mattis ullamcorper velit sed ullamcorper. Nunc faucibus a pellentesque sit amet porttitor eget. Tellus integer feugiat scelerisque varius morbi. Lorem sed risus ultricies tristique nulla aliquet enim tortor at. Eget nulla facilisi etiam dignissim diam quis enim lobortis scelerisque. Adipiscing elit duis tristique sollicitudin. Adipiscing elit pellentesque habitant morbi tristique. Ac tincidunt vitae semper quis lectus nulla at. Maecenas sed enim ut sem viverra. Erat pellentesque adipiscing commodo elit at imperdiet. Dolor morbi non arcu risus quis varius quam quisque. Fringilla urna porttitor rhoncus dolor purus non enim praesent. Tellus integer feugiat scelerisque varius morbi enim nunc faucibus a. Felis eget nunc lobortis mattis aliquam faucibus purus in. Fringilla phasellus faucibus scelerisque eleifend. Pulvinar etiam non quam lacus suspendisse faucibus interdum posuere. Risus ultricies tristique nulla aliquet. Lectus sit amet est placerat. Ac ut consequat semper viverra nam libero justo. Dapibus ultrices in iaculis nunc sed augue. Mattis ullamcorper velit sed ullamcorper. Eget nullam non nisi est. Vitae elementum curabitur vitae nunc sed velit. Sit amet commodo nulla facilisi nullam vehicula ipsum a arcu. Tempor nec feugiat nisl pretium fusce id velit ut. Nulla pellentesque dignissim enim sit amet venenatis. Sed tempus urna et pharetra pharetra. Congue quisque egestas diam in. Convallis posuere morbi leo urna. Nec tincidunt praesent semper feugiat nibh sed pulvinar proin gravida. Sagittis nisl rhoncus mattis rhoncus urna neque viverra justo. Scelerisque felis imperdiet proin fermentum leo vel. Ut placerat orci nulla pellentesque dignissim enim sit amet. In cursus turpis massa tincidunt dui. Rutrum quisque non tellus orci ac auctor augue mauris augue. Cursus vitae congue mauris rhoncus aenean vel elit scelerisque mauris. Scelerisque fermentum dui faucibus in ornare quam viverra orci. Habitant morbi tristique senectus et netus et. Ridiculus mus mauris vitae ultricies leo. Vitae semper quis lectus nulla at volutpat diam. Purus faucibus ornare suspendisse sed nisi. Enim lobortis scelerisque fermentum dui faucibus in ornare quam. Mi tempus imperdiet nulla malesuada pellentesque elit eget. Varius duis at consectetur lorem donec. Pulvinar pellentesque habitant morbi tristique senectus et netus et. A iaculis at erat pellentesque adipiscing commodo elit at imperdiet. Mi ipsum faucibus vitae aliquet nec. Libero volutpat sed cras ornare arcu dui vivamus arcu. Natoque penatibus et magnis dis parturient montes nascetur ridiculus. Maecenas volutpat blandit aliquam etiam erat velit scelerisque. Cras adipiscing enim eu turpis. Nec tincidunt praesent semper feugiat nibh sed pulvinar. Justo laoreet sit amet cursus sit amet dictum sit. Velit scelerisque in dictum non consectetur a erat nam. Turpis tincidunt id aliquet risus feugiat in ante. Aliquet risus feugiat in ante metus dictum. Hac habitasse platea dictumst quisque sagittis purus sit. Et pharetra pharetra massa massa ultricies. Sit amet nisl suscipit adipiscing bibendum est ultricies integer. Venenatis urna cursus eget nunc scelerisque viverra mauris in. Integer quis auctor elit sed. In est ante in nibh mauris cursus mattis molestie. Scelerisque in dictum non consectetur a erat nam at. Lectus sit amet est placerat in. Sit amet cursus sit amet. Nibh nisl condimentum id venenatis a condimentum. Purus ut faucibus pulvinar elementum integer enim. Pharetra sit amet aliquam id diam maecenas. Id cursus metus aliquam eleifend mi in nulla posuere. Lobortis mattis aliquam faucibus purus in massa tempor nec. Urna neque viverra justo nec ultrices dui sapien eget. Enim ut sem viverra aliquet eget sit amet. In eu mi bibendum neque egestas congue quisque egestas. Enim neque volutpat ac tincidunt. Orci ac auctor augue mauris augue neque gravida in fermentum. Velit aliquet sagittis id consectetur. Enim ut sem viverra aliquet eget sit amet tellus. Semper auctor neque vitae tempus quam pellentesque nec. Non blandit massa enim nec dui nunc. Morbi blandit cursus risus at ultrices mi tempus imperdiet nulla. Arcu non odio euismod lacinia at quis risus. Dictum varius duis at consectetur lorem donec massa. Blandit massa enim nec dui. Nibh ipsum consequat nisl vel. Turpis in eu mi bibendum neque. Ut tristique et egestas quis. Ac odio tempor orci dapibus. Gravida dictum fusce ut placerat orci nulla pellentesque dignissim. Integer feugiat scelerisque varius morbi enim. Libero volutpat sed cras ornare arcu dui. Odio aenean sed adipiscing diam. Et egestas quis ipsum suspendisse ultrices. Aliquet lectus proin nibh nisl condimentum. Sit amet consectetur adipiscing elit duis tristique sollicitudin nibh sit. Blandit massa enim nec dui. Tellus molestie nunc non blandit massa enim nec. Tortor vitae purus faucibus ornare suspendisse sed nisi. Nascetur ridiculus mus mauris vitae ultricies leo. Elementum facilisis leo vel fringilla est ullamcorper eget nulla. Diam maecenas ultricies mi eget. Duis tristique sollicitudin nibh sit amet commodo nulla. Tempus iaculis urna id volutpat lacus laoreet non curabitur gravida. Dictumst quisque sagittis purus sit amet. Viverra mauris in aliquam sem. Quis risus sed vulputate odio ut enim blandit volutpat maecenas. Condimentum mattis pellentesque id nibh tortor id. Non sodales neque sodales ut etiam sit amet. Ipsum consequat nisl vel pretium. Cursus in hac habitasse platea dictumst quisque sagittis purus sit. Fringilla est ullamcorper eget nulla facilisi etiam. Tellus elementum sagittis vitae et leo duis ut diam quam. Nisl vel pretium lectus quam id leo in.' = 'long'
diff --git a/tests/data/valid/toml-lang-compliance/valid/qa/qa-key-string-40kb.json b/tests/data/valid/toml-lang-compliance/valid/qa/qa-key-string-40kb.json
new file mode 100644
index 0000000..8a45674
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/qa/qa-key-string-40kb.json
@@ -0,0 +1,2 @@
+{"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Quam lacus suspendisse faucibus interdum posuere lorem ipsum dolor. Amet consectetur adipiscing elit ut. Nulla facilisi etiam dignissim diam quis enim lobortis. Curabitur vitae nunc sed velit dignissim sodales ut eu. Fames ac turpis egestas sed tempus urna et. Facilisi cras fermentum odio eu feugiat pretium. Nec tincidunt praesent semper feugiat nibh sed pulvinar proin gravida. Est lorem ipsum dolor sit amet consectetur adipiscing elit. Vel quam elementum pulvinar etiam non quam lacus. Pharetra et ultrices neque ornare aenean euismod. Nisl nisi scelerisque eu ultrices. Eget dolor morbi non arcu risus. Bibendum neque egestas congue quisque egestas diam in arcu cursus. Faucibus nisl tincidunt eget nullam. Nisl pretium fusce id velit ut tortor pretium viverra suspendisse. Mauris ultrices eros in cursus. Donec ac odio tempor orci dapibus ultrices in iaculis. Tellus cras adipiscing enim eu turpis egestas pretium aenean pharetra. Eros in cursus turpis massa. Nascetur ridiculus mus mauris vitae ultricies leo integer malesuada nunc. Velit sed ullamcorper morbi tincidunt ornare massa eget egestas purus. Aenean euismod elementum nisi quis eleifend quam. Magnis dis parturient montes nascetur ridiculus mus. Eu tincidunt tortor aliquam nulla facilisi cras. Tristique senectus et netus et malesuada fames. Urna nec tincidunt praesent semper feugiat nibh sed pulvinar. Vitae ultricies leo integer malesuada nunc vel risus commodo viverra. Ac turpis egestas sed tempus urna et. Amet mauris commodo quis imperdiet massa tincidunt. Urna nunc id cursus metus aliquam eleifend mi. In nulla posuere sollicitudin aliquam ultrices sagittis orci a scelerisque. Neque aliquam vestibulum morbi blandit cursus. Pulvinar mattis nunc sed blandit libero volutpat sed. Sed egestas egestas fringilla phasellus faucibus scelerisque eleifend donec pretium. Blandit cursus risus at ultrices mi tempus. Turpis massa sed elementum tempus egestas sed sed. Dictum varius duis at consectetur lorem. Commodo ullamcorper a lacus vestibulum sed arcu non. Dolor magna eget est lorem. Tincidunt arcu non sodales neque sodales ut etiam sit amet. Sit amet risus nullam eget felis eget nunc lobortis. Risus in hendrerit gravida rutrum quisque non tellus orci. Elementum pulvinar etiam non quam lacus suspendisse faucibus. Morbi tristique senectus et netus et malesuada. In aliquam sem fringilla ut morbi tincidunt. Ornare aenean euismod elementum nisi quis eleifend quam. Sed id semper risus in hendrerit gravida rutrum quisque. Lorem ipsum dolor sit amet consectetur adipiscing elit. A condimentum vitae sapien pellentesque habitant morbi tristique senectus et. Faucibus purus in massa tempor nec feugiat nisl. Vehicula ipsum a arcu cursus vitae congue. Facilisi cras fermentum odio eu feugiat pretium nibh. Viverra mauris in aliquam sem fringilla ut morbi tincidunt. Ultrices dui sapien eget mi proin sed libero enim. Nisi est sit amet facilisis magna etiam tempor. Posuere ac ut consequat semper viverra nam. Dis parturient montes nascetur ridiculus mus mauris vitae. Nec sagittis aliquam malesuada bibendum. Mattis pellentesque id nibh tortor id aliquet lectus. Vitae congue eu consequat ac felis donec et. Cras sed felis eget velit aliquet sagittis id consectetur purus. Pellentesque elit ullamcorper dignissim cras tincidunt. Pellentesque dignissim enim sit amet venenatis urna. A cras semper auctor neque vitae tempus. Amet massa vitae tortor condimentum lacinia quis vel eros donec. Tempor commodo ullamcorper a lacus. Nibh tellus molestie nunc non blandit massa enim nec dui. Viverra orci sagittis eu volutpat odio facilisis mauris sit. Sed augue lacus viverra vitae. Vulputate eu scelerisque felis imperdiet proin fermentum leo vel orci. Tellus rutrum tellus pellentesque eu tincidunt tortor. Cras semper auctor neque vitae tempus quam pellentesque nec. Lorem ipsum dolor sit amet consectetur adipiscing elit ut aliquam. Tristique magna sit amet purus gravida quis blandit turpis. Viverra ipsum nunc aliquet bibendum. Arcu bibendum at varius vel. Amet mattis vulputate enim nulla. Vulputate enim nulla aliquet porttitor. Volutpat blandit aliquam etiam erat velit scelerisque in dictum. Morbi tristique senectus et netus et malesuada fames ac. Faucibus et molestie ac feugiat sed. Tellus elementum sagittis vitae et leo duis. Id aliquet lectus proin nibh. Ornare arcu dui vivamus arcu. Morbi tincidunt augue interdum velit euismod in pellentesque massa placerat. Quis eleifend quam adipiscing vitae. Tristique senectus et netus et malesuada fames ac turpis. Pharetra convallis posuere morbi leo. Ornare arcu odio ut sem nulla pharetra diam sit. Morbi tristique senectus et netus et. Dictum non consectetur a erat nam at lectus urna. Varius vel pharetra vel turpis. Mi ipsum faucibus vitae aliquet. Tellus in metus vulputate eu scelerisque felis imperdiet proin. In est ante in nibh mauris cursus mattis. Massa ultricies mi quis hendrerit dolor magna eget. Fermentum leo vel orci porta. Elit ut aliquam purus sit amet luctus venenatis lectus. Eget aliquet nibh praesent tristique magna sit amet. Arcu non odio euismod lacinia at quis. Montes nascetur ridiculus mus mauris vitae ultricies. Tempus quam pellentesque nec nam aliquam sem et tortor. Morbi leo urna molestie at elementum eu facilisis sed. In fermentum posuere urna nec tincidunt. Neque aliquam vestibulum morbi blandit cursus risus. Vulputate dignissim suspendisse in est ante in nibh mauris cursus. Lorem ipsum dolor sit amet consectetur adipiscing. Orci eu lobortis elementum nibh tellus molestie nunc non. Enim diam vulputate ut pharetra sit amet aliquam. Convallis convallis tellus id interdum velit laoreet id donec ultrices. Sit amet mattis vulputate enim nulla aliquet porttitor lacus luctus. A lacus vestibulum sed arcu non odio. Ut tortor pretium viverra suspendisse potenti nullam ac tortor. Diam vel quam elementum pulvinar etiam non quam. Viverra justo nec ultrices dui. Eu volutpat odio facilisis mauris sit amet massa. Sed ullamcorper morbi tincidunt ornare massa eget egestas purus. Ac felis donec et odio pellentesque. Nisl vel pretium lectus quam id leo in. Ultricies lacus sed turpis tincidunt id. At urna condimentum mattis pellentesque id nibh tortor id. Sem nulla pharetra diam sit amet nisl suscipit. Neque viverra justo nec ultrices. Arcu cursus euismod quis viverra nibh cras pulvinar. Dolor sit amet consectetur adipiscing elit ut aliquam purus. Id diam vel quam elementum pulvinar etiam non. Elementum pulvinar etiam non quam lacus suspendisse faucibus. Id aliquet lectus proin nibh nisl condimentum id venenatis. Sit amet consectetur adipiscing elit duis tristique sollicitudin nibh. Sed faucibus turpis in eu mi bibendum neque egestas congue. Consectetur libero id faucibus nisl tincidunt eget nullam. At volutpat diam ut venenatis tellus in metus vulputate eu. Condimentum lacinia quis vel eros donec ac odio. Sit amet porttitor eget dolor morbi non arcu risus quis. Viverra mauris in aliquam sem fringilla ut morbi tincidunt. Metus dictum at tempor commodo ullamcorper. At ultrices mi tempus imperdiet nulla. Est ullamcorper eget nulla facilisi etiam dignissim diam quis. Lobortis elementum nibh tellus molestie nunc non. Placerat in egestas erat imperdiet sed. Placerat in egestas erat imperdiet sed euismod. Lobortis feugiat vivamus at augue eget arcu dictum varius. Ut sem nulla pharetra diam sit amet. Et tortor at risus viverra adipiscing at in. Tempor nec feugiat nisl pretium. Cursus euismod quis viverra nibh. Eget mi proin sed libero enim sed. Aliquam id diam maecenas ultricies. Mi tempus imperdiet nulla malesuada pellentesque elit eget. Gravida quis blandit turpis cursus in hac habitasse platea dictumst. Sed tempus urna et pharetra pharetra massa massa. Dolor purus non enim praesent elementum facilisis leo vel. Pharetra vel turpis nunc eget. Quam pellentesque nec nam aliquam sem et tortor consequat id. Orci eu lobortis elementum nibh tellus molestie nunc non. Porttitor leo a diam sollicitudin tempor id. Tincidunt ornare massa eget egestas purus viverra accumsan in nisl. Quam lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Elit ut aliquam purus sit amet luctus venenatis lectus. Velit egestas dui id ornare arcu odio ut sem nulla. Lacus viverra vitae congue eu consequat ac felis donec. Nulla aliquet porttitor lacus luctus accumsan tortor posuere ac ut. Lorem dolor sed viverra ipsum. Blandit libero volutpat sed cras ornare arcu. Egestas erat imperdiet sed euismod nisi porta lorem mollis. Viverra maecenas accumsan lacus vel. Enim neque volutpat ac tincidunt. Porttitor massa id neque aliquam vestibulum morbi blandit cursus risus. Malesuada bibendum arcu vitae elementum curabitur vitae nunc. Et malesuada fames ac turpis egestas integer. Egestas egestas fringilla phasellus faucibus scelerisque eleifend donec pretium. Est placerat in egestas erat imperdiet sed. Non arcu risus quis varius quam quisque. Lorem mollis aliquam ut porttitor leo a. Viverra tellus in hac habitasse platea dictumst vestibulum rhoncus. Fermentum iaculis eu non diam. Erat imperdiet sed euismod nisi porta lorem mollis aliquam. Varius vel pharetra vel turpis nunc eget lorem dolor. Rhoncus mattis rhoncus urna neque viverra. Hac habitasse platea dictumst quisque sagittis purus sit. At quis risus sed vulputate odio ut enim. Pharetra magna ac placerat vestibulum lectus mauris ultrices eros. Rutrum quisque non tellus orci ac auctor. Iaculis eu non diam phasellus vestibulum lorem sed. Ut sem nulla pharetra diam sit amet nisl suscipit. Risus at ultrices mi tempus. Vitae tortor condimentum lacinia quis vel eros donec. Sed tempus urna et pharetra. Posuere sollicitudin aliquam ultrices sagittis orci. Congue quisque egestas diam in arcu. Hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Pellentesque habitant morbi tristique senectus et netus et. Id interdum velit laoreet id. Fusce ut placerat orci nulla pellentesque dignissim. Pretium nibh ipsum consequat nisl vel pretium. Etiam erat velit scelerisque in dictum non consectetur a. Turpis in eu mi bibendum neque egestas congue quisque egestas. Pulvinar sapien et ligula ullamcorper malesuada. Ultricies tristique nulla aliquet enim tortor at. Suspendisse interdum consectetur libero id faucibus. Lorem sed risus ultricies tristique nulla aliquet. Tristique senectus et netus et malesuada fames. Eu augue ut lectus arcu bibendum at varius vel. Egestas sed tempus urna et pharetra pharetra massa massa ultricies. Aliquet eget sit amet tellus cras adipiscing. Massa placerat duis ultricies lacus sed turpis tincidunt id aliquet. Ornare massa eget egestas purus viverra accumsan in nisl. Justo laoreet sit amet cursus sit amet. In metus vulputate eu scelerisque felis imperdiet proin. At erat pellentesque adipiscing commodo elit at. Ipsum suspendisse ultrices gravida dictum fusce. Lectus sit amet est placerat in egestas erat. Aliquam ultrices sagittis orci a. Sagittis id consectetur purus ut faucibus pulvinar elementum. Ornare arcu odio ut sem nulla pharetra diam. Sit amet purus gravida quis blandit turpis cursus. Duis ultricies lacus sed turpis tincidunt. Malesuada fames ac turpis egestas sed tempus urna et. Viverra ipsum nunc aliquet bibendum enim facilisis. Et pharetra pharetra massa massa ultricies mi quis. Eget duis at tellus at urna condimentum mattis. Euismod in pellentesque massa placerat. Enim nunc faucibus a pellentesque sit amet porttitor. Dolor sed viverra ipsum nunc aliquet. Donec enim diam vulputate ut pharetra sit amet. Feugiat sed lectus vestibulum mattis ullamcorper velit sed. Erat pellentesque adipiscing commodo elit at imperdiet. Nisl purus in mollis nunc sed id semper risus. Tincidunt augue interdum velit euismod in pellentesque massa. Facilisis magna etiam tempor orci. Mauris in aliquam sem fringilla ut. Gravida dictum fusce ut placerat orci. Sed risus ultricies tristique nulla. Odio morbi quis commodo odio. Feugiat in ante metus dictum at tempor commodo ullamcorper. Porta non pulvinar neque laoreet suspendisse interdum. Etiam tempor orci eu lobortis elementum. Fusce ut placerat orci nulla pellentesque dignissim. Ornare lectus sit amet est placerat in egestas erat. Quis vel eros donec ac. Elementum pulvinar etiam non quam lacus. Sit amet tellus cras adipiscing enim eu turpis. Amet tellus cras adipiscing enim eu. Sed faucibus turpis in eu mi bibendum. Lectus proin nibh nisl condimentum id. Sollicitudin nibh sit amet commodo nulla. Sed tempus urna et pharetra pharetra massa massa. Magna eget est lorem ipsum. Elit ullamcorper dignissim cras tincidunt lobortis feugiat vivamus at. Fermentum dui faucibus in ornare quam viverra orci sagittis eu. Dignissim convallis aenean et tortor. Ut faucibus pulvinar elementum integer enim neque. Nibh cras pulvinar mattis nunc sed. Pellentesque sit amet porttitor eget dolor morbi. Mi eget mauris pharetra et ultrices neque ornare aenean euismod. Quis risus sed vulputate odio ut enim blandit volutpat. Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. In vitae turpis massa sed elementum tempus egestas sed sed. Urna id volutpat lacus laoreet non. Egestas pretium aenean pharetra magna ac placerat. Amet commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Donec et odio pellentesque diam volutpat commodo sed. Etiam non quam lacus suspendisse. Augue neque gravida in fermentum et sollicitudin ac orci. Eu feugiat pretium nibh ipsum. Nam at lectus urna duis convallis convallis tellus id. Egestas integer eget aliquet nibh. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae auctor. Urna condimentum mattis pellentesque id nibh tortor id. In egestas erat imperdiet sed euismod. Ut sem viverra aliquet eget sit amet tellus. Feugiat pretium nibh ipsum consequat nisl vel pretium. Volutpat odio facilisis mauris sit amet. Mi sit amet mauris commodo quis imperdiet massa tincidunt. Neque volutpat ac tincidunt vitae semper quis lectus nulla at. Nec feugiat in fermentum posuere urna nec. Ut venenatis tellus in metus vulputate eu. Vestibulum rhoncus est pellentesque elit ullamcorper dignissim. Eu scelerisque felis imperdiet proin. Vitae et leo duis ut diam quam nulla. Ut venenatis tellus in metus vulputate eu scelerisque. Tincidunt dui ut ornare lectus sit amet. Adipiscing diam donec adipiscing tristique risus. Turpis nunc eget lorem dolor sed viverra ipsum nunc aliquet. Non sodales neque sodales ut. Massa placerat duis ultricies lacus sed turpis tincidunt. Viverra orci sagittis eu volutpat odio facilisis mauris sit amet. Adipiscing vitae proin sagittis nisl. Vitae aliquet nec ullamcorper sit. Potenti nullam ac tortor vitae purus. Ultricies lacus sed turpis tincidunt id. Ut diam quam nulla porttitor massa id neque aliquam vestibulum. Semper eget duis at tellus at urna condimentum mattis pellentesque. Nec tincidunt praesent semper feugiat nibh sed pulvinar proin. Dictum fusce ut placerat orci nulla pellentesque dignissim. Amet luctus venenatis lectus magna fringilla urna. Quam quisque id diam vel quam elementum pulvinar. At tempor commodo ullamcorper a. Magna etiam tempor orci eu lobortis. Suspendisse ultrices gravida dictum fusce. Massa ultricies mi quis hendrerit dolor magna. Massa tincidunt nunc pulvinar sapien et ligula ullamcorper malesuada proin. Aliquet enim tortor at auctor urna nunc id. Semper feugiat nibh sed pulvinar proin gravida. Porttitor rhoncus dolor purus non enim. Metus aliquam eleifend mi in nulla. Lectus arcu bibendum at varius vel pharetra. Sed vulputate odio ut enim blandit volutpat. Et ligula ullamcorper malesuada proin libero nunc consequat interdum varius. Donec et odio pellentesque diam volutpat commodo. Id ornare arcu odio ut sem nulla pharetra diam sit. Est ullamcorper eget nulla facilisi etiam dignissim diam quis enim. Sagittis vitae et leo duis ut diam quam nulla. Elementum nisi quis eleifend quam. Congue mauris rhoncus aenean vel elit. Adipiscing elit duis tristique sollicitudin nibh sit. Egestas egestas fringilla phasellus faucibus scelerisque. Morbi tincidunt augue interdum velit euismod. Massa sed elementum tempus egestas sed sed. Id leo in vitae turpis massa sed elementum tempus egestas. In pellentesque massa placerat duis ultricies lacus sed turpis. Vitae proin sagittis nisl rhoncus mattis rhoncus. Enim tortor at auctor urna nunc id. In fermentum posuere urna nec tincidunt praesent semper feugiat nibh. Aliquam ut porttitor leo a diam sollicitudin tempor id. Pellentesque elit eget gravida cum sociis natoque. Molestie at elementum eu facilisis sed odio morbi quis. Tristique senectus et netus et malesuada fames ac turpis. Proin libero nunc consequat interdum varius sit amet mattis. Pellentesque id nibh tortor id. Risus sed vulputate odio ut enim blandit. Laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt eget. Morbi tincidunt augue interdum velit euismod in pellentesque. Pharetra pharetra massa massa ultricies mi quis hendrerit. Nunc aliquet bibendum enim facilisis gravida neque. Feugiat sed lectus vestibulum mattis ullamcorper velit sed ullamcorper. Risus quis varius quam quisque id diam vel. Et ultrices neque ornare aenean. Aliquet sagittis id consectetur purus ut faucibus pulvinar elementum. Nibh ipsum consequat nisl vel. Mauris rhoncus aenean vel elit scelerisque mauris pellentesque pulvinar. Ornare quam viverra orci sagittis eu volutpat odio facilisis. Euismod nisi porta lorem mollis aliquam. Enim ut tellus elementum sagittis. Rhoncus mattis rhoncus urna neque. Malesuada fames ac turpis egestas. Cursus in hac habitasse platea dictumst quisque sagittis. Sit amet aliquam id diam maecenas ultricies mi eget mauris. Enim sit amet venenatis urna cursus eget nunc. Fermentum odio eu feugiat pretium nibh ipsum consequat. Eu scelerisque felis imperdiet proin. Nullam non nisi est sit amet facilisis magna etiam tempor. In mollis nunc sed id semper risus in hendrerit. Sollicitudin nibh sit amet commodo nulla facilisi nullam. Sit amet nisl purus in mollis nunc sed id. Nam libero justo laoreet sit amet cursus sit amet dictum. Condimentum id venenatis a condimentum vitae sapien pellentesque. Porta nibh venenatis cras sed felis. Lectus nulla at volutpat diam ut venenatis tellus in. Aliquam etiam erat velit scelerisque in dictum non consectetur a. Leo vel fringilla est ullamcorper eget. Sodales ut etiam sit amet nisl purus in mollis nunc. Euismod nisi porta lorem mollis aliquam. Ornare arcu odio ut sem nulla. Sed felis eget velit aliquet sagittis id consectetur. Pellentesque nec nam aliquam sem et tortor consequat id. Enim nec dui nunc mattis enim ut tellus elementum. Nullam non nisi est sit amet facilisis magna. Rutrum quisque non tellus orci ac auctor augue. Nunc vel risus commodo viverra maecenas accumsan lacus. Viverra vitae congue eu consequat. Sollicitudin nibh sit amet commodo nulla. Amet volutpat consequat mauris nunc congue nisi. Maecenas pharetra convallis posuere morbi leo urna molestie at. Mattis vulputate enim nulla aliquet porttitor lacus luctus accumsan tortor. Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc consequat. Adipiscing diam donec adipiscing tristique risus. Elementum curabitur vitae nunc sed velit dignissim sodales ut. Eleifend donec pretium vulputate sapien nec. Commodo quis imperdiet massa tincidunt nunc pulvinar. Proin libero nunc consequat interdum varius sit amet mattis. Facilisis gravida neque convallis a cras semper auctor neque vitae. Quisque egestas diam in arcu cursus. Nunc eget lorem dolor sed viverra ipsum. Mauris sit amet massa vitae tortor condimentum lacinia quis vel. Aliquam sem et tortor consequat id porta nibh venenatis cras. Nunc sed id semper risus in. Enim sed faucibus turpis in eu mi bibendum neque. Molestie nunc non blandit massa enim. Enim praesent elementum facilisis leo vel fringilla est ullamcorper. Semper risus in hendrerit gravida rutrum quisque non tellus orci. Ac turpis egestas maecenas pharetra. In nulla posuere sollicitudin aliquam. Justo nec ultrices dui sapien eget mi proin sed libero. In ornare quam viverra orci sagittis eu. Proin nibh nisl condimentum id venenatis. Morbi enim nunc faucibus a pellentesque sit amet porttitor eget. Quis risus sed vulputate odio ut enim blandit. Risus feugiat in ante metus dictum at tempor commodo. Sodales neque sodales ut etiam. Nunc id cursus metus aliquam. Gravida dictum fusce ut placerat orci nulla pellentesque dignissim enim. Augue ut lectus arcu bibendum at. Quis varius quam quisque id diam vel quam. Egestas congue quisque egestas diam in arcu. Condimentum mattis pellentesque id nibh tortor id aliquet lectus. Enim lobortis scelerisque fermentum dui faucibus in. In tellus integer feugiat scelerisque varius morbi enim nunc. Mattis molestie a iaculis at erat pellentesque. Elit scelerisque mauris pellentesque pulvinar pellentesque habitant morbi tristique. Lorem ipsum dolor sit amet consectetur adipiscing elit ut aliquam. Nisl rhoncus mattis rhoncus urna neque. Ac auctor augue mauris augue neque gravida in fermentum et. Sodales ut eu sem integer vitae justo eget. Sed egestas egestas fringilla phasellus. Viverra adipiscing at in tellus integer feugiat scelerisque varius. Purus gravida quis blandit turpis. Id porta nibh venenatis cras sed. Mattis vulputate enim nulla aliquet porttitor lacus. Augue eget arcu dictum varius duis at consectetur lorem donec. Nulla at volutpat diam ut venenatis tellus in metus. Aliquam etiam erat velit scelerisque in dictum non consectetur. Turpis cursus in hac habitasse platea dictumst. Consequat mauris nunc congue nisi vitae suscipit tellus. Volutpat maecenas volutpat blandit aliquam etiam. Massa massa ultricies mi quis hendrerit dolor magna eget est. Velit egestas dui id ornare arcu. Non consectetur a erat nam at. Orci sagittis eu volutpat odio facilisis mauris sit amet. Dui id ornare arcu odio. Sed arcu non odio euismod lacinia. Feugiat in ante metus dictum. Gravida arcu ac tortor dignissim convallis. Egestas sed tempus urna et pharetra pharetra massa massa. Nulla facilisi nullam vehicula ipsum a arcu. Ipsum a arcu cursus vitae congue mauris. Porttitor rhoncus dolor purus non. Magna sit amet purus gravida quis blandit. Sapien eget mi proin sed libero enim sed faucibus turpis. Nisl nunc mi ipsum faucibus vitae aliquet nec ullamcorper sit. Pellentesque dignissim enim sit amet venenatis urna cursus eget. Pharetra massa massa ultricies mi quis hendrerit. Sapien nec sagittis aliquam malesuada bibendum. Nunc scelerisque viverra mauris in aliquam sem fringilla ut. Dolor magna eget est lorem ipsum dolor. Amet commodo nulla facilisi nullam. Pellentesque elit ullamcorper dignissim cras. Id porta nibh venenatis cras sed felis eget. Nam at lectus urna duis. Laoreet non curabitur gravida arcu ac tortor dignissim convallis. Nunc lobortis mattis aliquam faucibus purus in massa tempor. Sit amet luctus venenatis lectus magna fringilla. Duis ultricies lacus sed turpis tincidunt id. Sed velit dignissim sodales ut eu. Ut tortor pretium viverra suspendisse potenti nullam. Iaculis at erat pellentesque adipiscing. Ipsum nunc aliquet bibendum enim facilisis gravida neque. Nulla aliquet enim tortor at auctor urna nunc id cursus. Amet cursus sit amet dictum sit amet justo donec enim. Enim nunc faucibus a pellentesque sit amet porttitor eget dolor. Pharetra magna ac placerat vestibulum lectus mauris ultrices eros in. Nulla facilisi etiam dignissim diam quis enim. Ut enim blandit volutpat maecenas volutpat blandit aliquam etiam erat. Imperdiet proin fermentum leo vel orci porta non pulvinar neque. Vel fringilla est ullamcorper eget nulla. Bibendum neque egestas congue quisque egestas diam in arcu cursus. Ipsum nunc aliquet bibendum enim facilisis gravida neque convallis a. Arcu cursus vitae congue mauris rhoncus aenean vel elit. Augue eget arcu dictum varius duis. Tristique et egestas quis ipsum. Quis varius quam quisque id. Varius sit amet mattis vulputate. Mattis molestie a iaculis at erat pellentesque. Libero justo laoreet sit amet cursus. Aliquam id diam maecenas ultricies mi eget mauris pharetra. Ut eu sem integer vitae justo eget. Fames ac turpis egestas sed. Suspendisse in est ante in nibh mauris cursus mattis. Faucibus pulvinar elementum integer enim neque volutpat ac tincidunt vitae. Neque vitae tempus quam pellentesque nec nam aliquam. Lobortis elementum nibh tellus molestie nunc non. Lacus vel facilisis volutpat est velit egestas dui. Justo laoreet sit amet cursus sit amet dictum sit amet. Adipiscing enim eu turpis egestas pretium aenean pharetra magna. Cursus metus aliquam eleifend mi in nulla posuere. Nibh mauris cursus mattis molestie a. Dignissim diam quis enim lobortis scelerisque fermentum. A scelerisque purus semper eget duis at tellus. Lacus sed turpis tincidunt id aliquet risus feugiat in. Non tellus orci ac auctor. Ultrices in iaculis nunc sed augue lacus. Tincidunt tortor aliquam nulla facilisi cras. Nulla facilisi nullam vehicula ipsum a arcu cursus vitae congue. Eget magna fermentum iaculis eu non diam phasellus. Pharetra massa massa ultricies mi quis. Eget mauris pharetra et ultrices neque ornare. Aliquam faucibus purus in massa. Facilisi morbi tempus iaculis urna id volutpat lacus. Accumsan lacus vel facilisis volutpat. Curabitur gravida arcu ac tortor. Quam lacus suspendisse faucibus interdum. Elementum nibh tellus molestie nunc non blandit massa enim. Libero id faucibus nisl tincidunt. Bibendum ut tristique et egestas. Ut diam quam nulla porttitor massa id neque aliquam vestibulum. Augue interdum velit euismod in pellentesque. Adipiscing diam donec adipiscing tristique risus nec feugiat. Fringilla ut morbi tincidunt augue interdum velit. Vitae et leo duis ut diam quam nulla porttitor massa. Egestas integer eget aliquet nibh praesent tristique. Posuere sollicitudin aliquam ultrices sagittis orci a. Nisi est sit amet facilisis. Risus quis varius quam quisque id diam. Faucibus turpis in eu mi. Et molestie ac feugiat sed lectus vestibulum. Porttitor lacus luctus accumsan tortor posuere ac. Platea dictumst vestibulum rhoncus est pellentesque. Tortor pretium viverra suspendisse potenti nullam ac tortor. Enim praesent elementum facilisis leo vel fringilla est. Proin libero nunc consequat interdum varius sit amet mattis vulputate. Turpis egestas pretium aenean pharetra magna ac placerat vestibulum lectus. Nulla pharetra diam sit amet nisl suscipit. Mauris nunc congue nisi vitae suscipit tellus mauris a diam. Faucibus in ornare quam viverra orci sagittis eu volutpat. Volutpat consequat mauris nunc congue nisi vitae. Dui nunc mattis enim ut tellus. Adipiscing elit ut aliquam purus sit amet luctus. Tempus egestas sed sed risus. Scelerisque fermentum dui faucibus in ornare quam viverra orci. Massa ultricies mi quis hendrerit dolor magna eget. Pulvinar mattis nunc sed blandit libero volutpat sed cras ornare. Ut eu sem integer vitae justo eget magna fermentum. Ornare quam viverra orci sagittis. Eget dolor morbi non arcu risus quis varius quam. Tincidunt praesent semper feugiat nibh sed pulvinar. Sit amet justo donec enim diam vulputate. Dui faucibus in ornare quam viverra. Tincidunt tortor aliquam nulla facilisi cras fermentum odio eu. Turpis egestas sed tempus urna et. Pretium quam vulputate dignissim suspendisse in est ante in. Morbi quis commodo odio aenean sed adipiscing diam donec. Nunc mattis enim ut tellus elementum sagittis vitae et. Diam vel quam elementum pulvinar etiam non quam. Convallis posuere morbi leo urna molestie at elementum eu. Adipiscing at in tellus integer feugiat scelerisque varius morbi. Quis varius quam quisque id diam vel quam elementum. Dui accumsan sit amet nulla. Adipiscing elit duis tristique sollicitudin nibh sit amet commodo. Viverra ipsum nunc aliquet bibendum enim facilisis. Porta lorem mollis aliquam ut. Velit ut tortor pretium viverra suspendisse potenti. Quis viverra nibh cras pulvinar mattis nunc sed blandit. Pharetra magna ac placerat vestibulum. Mauris ultrices eros in cursus turpis massa. Lacus vestibulum sed arcu non odio euismod lacinia at. Dapibus ultrices in iaculis nunc sed. Cras adipiscing enim eu turpis egestas. Eget arcu dictum varius duis at consectetur. Consequat id porta nibh venenatis cras sed felis eget velit. Integer enim neque volutpat ac tincidunt vitae. Feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Ut morbi tincidunt augue interdum velit euismod. Sed cras ornare arcu dui vivamus arcu felis bibendum ut. Eget felis eget nunc lobortis mattis aliquam faucibus purus in. Luctus venenatis lectus magna fringilla urna porttitor rhoncus dolor. Nisl nunc mi ipsum faucibus vitae. Proin fermentum leo vel orci porta. Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Et leo duis ut diam quam. Eros in cursus turpis massa tincidunt. Volutpat est velit egestas dui id. Commodo odio aenean sed adipiscing diam. Quis blandit turpis cursus in hac habitasse platea dictumst quisque. Magna fringilla urna porttitor rhoncus dolor. Amet consectetur adipiscing elit ut aliquam purus sit amet. Vitae justo eget magna fermentum iaculis eu non diam. Hendrerit dolor magna eget est. Ac placerat vestibulum lectus mauris ultrices eros in cursus turpis. Egestas diam in arcu cursus. At varius vel pharetra vel turpis nunc. Lacus vel facilisis volutpat est velit. Ut ornare lectus sit amet est placerat in egestas. Quam adipiscing vitae proin sagittis nisl rhoncus. Dolor purus non enim praesent. Urna condimentum mattis pellentesque id. Magnis dis parturient montes nascetur ridiculus. Feugiat nisl pretium fusce id. Sed cras ornare arcu dui vivamus. Vitae turpis massa sed elementum tempus egestas sed sed. Ac feugiat sed lectus vestibulum mattis ullamcorper velit sed ullamcorper. Ac ut consequat semper viverra nam libero. Consectetur lorem donec massa sapien faucibus. Purus viverra accumsan in nisl nisi scelerisque eu ultrices. Eu turpis egestas pretium aenean pharetra. Nisl rhoncus mattis rhoncus urna neque viverra justo nec ultrices. Pellentesque sit amet porttitor eget dolor morbi non arcu. Vitae justo eget magna fermentum iaculis. Quis auctor elit sed vulputate mi sit. Purus viverra accumsan in nisl nisi scelerisque eu ultrices. Semper auctor neque vitae tempus quam pellentesque nec nam. Rhoncus dolor purus non enim. Sed turpis tincidunt id aliquet risus feugiat. Sit amet justo donec enim diam vulputate ut pharetra sit. Risus pretium quam vulputate dignissim suspendisse in est ante in. Massa sapien faucibus et molestie ac feugiat. Id aliquet risus feugiat in ante metus. Risus ultricies tristique nulla aliquet enim tortor at auctor urna. Sed lectus vestibulum mattis ullamcorper velit sed ullamcorper morbi. Lacus sed turpis tincidunt id aliquet risus feugiat in. Risus ultricies tristique nulla aliquet enim tortor. In ornare quam viverra orci sagittis eu volutpat. Netus et malesuada fames ac turpis egestas sed tempus urna. Fames ac turpis egestas maecenas pharetra convallis posuere morbi. Etiam erat velit scelerisque in dictum non. Cursus turpis massa tincidunt dui ut ornare lectus. Tristique sollicitudin nibh sit amet commodo nulla facilisi. Pellentesque pulvinar pellentesque habitant morbi tristique senectus et. Aliquet eget sit amet tellus cras. Nullam ac tortor vitae purus faucibus ornare. Lacus viverra vitae congue eu consequat. Vulputate ut pharetra sit amet. Est ante in nibh mauris cursus mattis molestie a. Ipsum suspendisse ultrices gravida dictum fusce ut placerat orci. Et tortor at risus viverra. Sed libero enim sed faucibus turpis in eu. Id cursus metus aliquam eleifend mi in nulla posuere sollicitudin. Risus viverra adipiscing at in. Imperdiet massa tincidunt nunc pulvinar sapien et. Nec feugiat in fermentum posuere urna nec tincidunt. Ultricies mi eget mauris pharetra et. Morbi tristique senectus et netus et malesuada fames ac. At quis risus sed vulputate. Interdum velit laoreet id donec. Sapien pellentesque habitant morbi tristique. Pharetra vel turpis nunc eget lorem dolor sed viverra. In massa tempor nec feugiat nisl. Massa tincidunt nunc pulvinar sapien et ligula ullamcorper malesuada proin. Mauris augue neque gravida in. Faucibus vitae aliquet nec ullamcorper sit amet risus. Id velit ut tortor pretium viverra suspendisse potenti. Leo integer malesuada nunc vel risus commodo viverra maecenas. Risus quis varius quam quisque id. Aliquam malesuada bibendum arcu vitae elementum curabitur vitae. Vestibulum lectus mauris ultrices eros in cursus turpis. Fermentum posuere urna nec tincidunt. Magna etiam tempor orci eu lobortis elementum nibh tellus molestie. Id ornare arcu odio ut. Facilisi nullam vehicula ipsum a arcu cursus vitae congue. Nulla pellentesque dignissim enim sit amet venenatis urna cursus eget. Viverra mauris in aliquam sem fringilla ut morbi tincidunt. Quis ipsum suspendisse ultrices gravida dictum fusce ut placerat orci. Sed cras ornare arcu dui vivamus arcu felis. Egestas diam in arcu cursus euismod quis. Tincidunt dui ut ornare lectus. Morbi tristique senectus et netus et. Ornare arcu dui vivamus arcu felis bibendum ut tristique. Habitant morbi tristique senectus et netus et malesuada fames ac. Ut tristique et egestas quis. Mollis aliquam ut porttitor leo. Venenatis tellus in metus vulputate eu scelerisque felis imperdiet proin. Sagittis eu volutpat odio facilisis mauris sit amet massa. Eu facilisis sed odio morbi. Nunc consequat interdum varius sit amet mattis. Velit dignissim sodales ut eu. Pellentesque eu tincidunt tortor aliquam. Porta lorem mollis aliquam ut porttitor. Rhoncus urna neque viverra justo nec ultrices. Viverra suspendisse potenti nullam ac tortor vitae purus. Fermentum posuere urna nec tincidunt praesent semper feugiat nibh sed. Purus sit amet luctus venenatis lectus magna fringilla urna porttitor. Sed lectus vestibulum mattis ullamcorper velit sed ullamcorper. Nulla posuere sollicitudin aliquam ultrices sagittis orci a scelerisque. Nisl nisi scelerisque eu ultrices vitae auctor. In vitae turpis massa sed elementum tempus egestas. Cursus sit amet dictum sit amet justo donec enim. Vitae congue eu consequat ac felis donec et. Augue interdum velit euismod in pellentesque massa placerat. Enim ut sem viverra aliquet eget sit amet. Velit scelerisque in dictum non consectetur a erat. Sed lectus vestibulum mattis ullamcorper velit sed ullamcorper. Nunc faucibus a pellentesque sit amet porttitor eget. Tellus integer feugiat scelerisque varius morbi. Lorem sed risus ultricies tristique nulla aliquet enim tortor at. Eget nulla facilisi etiam dignissim diam quis enim lobortis scelerisque. Adipiscing elit duis tristique sollicitudin. Adipiscing elit pellentesque habitant morbi tristique. Ac tincidunt vitae semper quis lectus nulla at. Maecenas sed enim ut sem viverra. Erat pellentesque adipiscing commodo elit at imperdiet. Dolor morbi non arcu risus quis varius quam quisque. Fringilla urna porttitor rhoncus dolor purus non enim praesent. Tellus integer feugiat scelerisque varius morbi enim nunc faucibus a. Felis eget nunc lobortis mattis aliquam faucibus purus in. Fringilla phasellus faucibus scelerisque eleifend. Pulvinar etiam non quam lacus suspendisse faucibus interdum posuere. Risus ultricies tristique nulla aliquet. Lectus sit amet est placerat. Ac ut consequat semper viverra nam libero justo. Dapibus ultrices in iaculis nunc sed augue. Mattis ullamcorper velit sed ullamcorper. Eget nullam non nisi est. Vitae elementum curabitur vitae nunc sed velit. Sit amet commodo nulla facilisi nullam vehicula ipsum a arcu. Tempor nec feugiat nisl pretium fusce id velit ut. Nulla pellentesque dignissim enim sit amet venenatis. Sed tempus urna et pharetra pharetra. Congue quisque egestas diam in. Convallis posuere morbi leo urna. Nec tincidunt praesent semper feugiat nibh sed pulvinar proin gravida. Sagittis nisl rhoncus mattis rhoncus urna neque viverra justo. Scelerisque felis imperdiet proin fermentum leo vel. Ut placerat orci nulla pellentesque dignissim enim sit amet. In cursus turpis massa tincidunt dui. Rutrum quisque non tellus orci ac auctor augue mauris augue. Cursus vitae congue mauris rhoncus aenean vel elit scelerisque mauris. Scelerisque fermentum dui faucibus in ornare quam viverra orci. Habitant morbi tristique senectus et netus et. Ridiculus mus mauris vitae ultricies leo. Vitae semper quis lectus nulla at volutpat diam. Purus faucibus ornare suspendisse sed nisi. Enim lobortis scelerisque fermentum dui faucibus in ornare quam. Mi tempus imperdiet nulla malesuada pellentesque elit eget. Varius duis at consectetur lorem donec. Pulvinar pellentesque habitant morbi tristique senectus et netus et. A iaculis at erat pellentesque adipiscing commodo elit at imperdiet. Mi ipsum faucibus vitae aliquet nec. Libero volutpat sed cras ornare arcu dui vivamus arcu. Natoque penatibus et magnis dis parturient montes nascetur ridiculus. Maecenas volutpat blandit aliquam etiam erat velit scelerisque. Cras adipiscing enim eu turpis. Nec tincidunt praesent semper feugiat nibh sed pulvinar. Justo laoreet sit amet cursus sit amet dictum sit. Velit scelerisque in dictum non consectetur a erat nam. Turpis tincidunt id aliquet risus feugiat in ante. Aliquet risus feugiat in ante metus dictum. Hac habitasse platea dictumst quisque sagittis purus sit. Et pharetra pharetra massa massa ultricies. Sit amet nisl suscipit adipiscing bibendum est ultricies integer. Venenatis urna cursus eget nunc scelerisque viverra mauris in. Integer quis auctor elit sed. In est ante in nibh mauris cursus mattis molestie. Scelerisque in dictum non consectetur a erat nam at. Lectus sit amet est placerat in. Sit amet cursus sit amet. Nibh nisl condimentum id venenatis a condimentum. Purus ut faucibus pulvinar elementum integer enim. Pharetra sit amet aliquam id diam maecenas. Id cursus metus aliquam eleifend mi in nulla posuere. Lobortis mattis aliquam faucibus purus in massa tempor nec. Urna neque viverra justo nec ultrices dui sapien eget. Enim ut sem viverra aliquet eget sit amet. In eu mi bibendum neque egestas congue quisque egestas. Enim neque volutpat ac tincidunt. Orci ac auctor augue mauris augue neque gravida in fermentum. Velit aliquet sagittis id consectetur. Enim ut sem viverra aliquet eget sit amet tellus. Semper auctor neque vitae tempus quam pellentesque nec. Non blandit massa enim nec dui nunc. Morbi blandit cursus risus at ultrices mi tempus imperdiet nulla. Arcu non odio euismod lacinia at quis risus. Dictum varius duis at consectetur lorem donec massa. Blandit massa enim nec dui. Nibh ipsum consequat nisl vel. Turpis in eu mi bibendum neque. Ut tristique et egestas quis. Ac odio tempor orci dapibus. Gravida dictum fusce ut placerat orci nulla pellentesque dignissim. Integer feugiat scelerisque varius morbi enim. Libero volutpat sed cras ornare arcu dui. Odio aenean sed adipiscing diam. Et egestas quis ipsum suspendisse ultrices. Aliquet lectus proin nibh nisl condimentum. Sit amet consectetur adipiscing elit duis tristique sollicitudin nibh sit. Blandit massa enim nec dui. Tellus molestie nunc non blandit massa enim nec. Tortor vitae purus faucibus ornare suspendisse sed nisi. Nascetur ridiculus mus mauris vitae ultricies leo. Elementum facilisis leo vel fringilla est ullamcorper eget nulla. Diam maecenas ultricies mi eget. Duis tristique sollicitudin nibh sit amet commodo nulla. Tempus iaculis urna id volutpat lacus laoreet non curabitur gravida. Dictumst quisque sagittis purus sit amet. Viverra mauris in aliquam sem. Quis risus sed vulputate odio ut enim blandit volutpat maecenas. Condimentum mattis pellentesque id nibh tortor id. Non sodales neque sodales ut etiam sit amet. Ipsum consequat nisl vel pretium. Cursus in hac habitasse platea dictumst quisque sagittis purus sit. Fringilla est ullamcorper eget nulla facilisi etiam. Tellus elementum sagittis vitae et leo duis ut diam quam. Nisl vel pretium lectus quam id leo in.":
+ {"type":"string","value":"long"}}
diff --git a/tests/data/valid/toml-lang-compliance/valid/qa/qa-key-string-40kb.toml b/tests/data/valid/toml-lang-compliance/valid/qa/qa-key-string-40kb.toml
new file mode 100644
index 0000000..00411dd
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/qa/qa-key-string-40kb.toml
@@ -0,0 +1 @@
+"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Quam lacus suspendisse faucibus interdum posuere lorem ipsum dolor. Amet consectetur adipiscing elit ut. Nulla facilisi etiam dignissim diam quis enim lobortis. Curabitur vitae nunc sed velit dignissim sodales ut eu. Fames ac turpis egestas sed tempus urna et. Facilisi cras fermentum odio eu feugiat pretium. Nec tincidunt praesent semper feugiat nibh sed pulvinar proin gravida. Est lorem ipsum dolor sit amet consectetur adipiscing elit. Vel quam elementum pulvinar etiam non quam lacus. Pharetra et ultrices neque ornare aenean euismod. Nisl nisi scelerisque eu ultrices. Eget dolor morbi non arcu risus. Bibendum neque egestas congue quisque egestas diam in arcu cursus. Faucibus nisl tincidunt eget nullam. Nisl pretium fusce id velit ut tortor pretium viverra suspendisse. Mauris ultrices eros in cursus. Donec ac odio tempor orci dapibus ultrices in iaculis. Tellus cras adipiscing enim eu turpis egestas pretium aenean pharetra. Eros in cursus turpis massa. Nascetur ridiculus mus mauris vitae ultricies leo integer malesuada nunc. Velit sed ullamcorper morbi tincidunt ornare massa eget egestas purus. Aenean euismod elementum nisi quis eleifend quam. Magnis dis parturient montes nascetur ridiculus mus. Eu tincidunt tortor aliquam nulla facilisi cras. Tristique senectus et netus et malesuada fames. Urna nec tincidunt praesent semper feugiat nibh sed pulvinar. Vitae ultricies leo integer malesuada nunc vel risus commodo viverra. Ac turpis egestas sed tempus urna et. Amet mauris commodo quis imperdiet massa tincidunt. Urna nunc id cursus metus aliquam eleifend mi. In nulla posuere sollicitudin aliquam ultrices sagittis orci a scelerisque. Neque aliquam vestibulum morbi blandit cursus. Pulvinar mattis nunc sed blandit libero volutpat sed. Sed egestas egestas fringilla phasellus faucibus scelerisque eleifend donec pretium. Blandit cursus risus at ultrices mi tempus. Turpis massa sed elementum tempus egestas sed sed. Dictum varius duis at consectetur lorem. Commodo ullamcorper a lacus vestibulum sed arcu non. Dolor magna eget est lorem. Tincidunt arcu non sodales neque sodales ut etiam sit amet. Sit amet risus nullam eget felis eget nunc lobortis. Risus in hendrerit gravida rutrum quisque non tellus orci. Elementum pulvinar etiam non quam lacus suspendisse faucibus. Morbi tristique senectus et netus et malesuada. In aliquam sem fringilla ut morbi tincidunt. Ornare aenean euismod elementum nisi quis eleifend quam. Sed id semper risus in hendrerit gravida rutrum quisque. Lorem ipsum dolor sit amet consectetur adipiscing elit. A condimentum vitae sapien pellentesque habitant morbi tristique senectus et. Faucibus purus in massa tempor nec feugiat nisl. Vehicula ipsum a arcu cursus vitae congue. Facilisi cras fermentum odio eu feugiat pretium nibh. Viverra mauris in aliquam sem fringilla ut morbi tincidunt. Ultrices dui sapien eget mi proin sed libero enim. Nisi est sit amet facilisis magna etiam tempor. Posuere ac ut consequat semper viverra nam. Dis parturient montes nascetur ridiculus mus mauris vitae. Nec sagittis aliquam malesuada bibendum. Mattis pellentesque id nibh tortor id aliquet lectus. Vitae congue eu consequat ac felis donec et. Cras sed felis eget velit aliquet sagittis id consectetur purus. Pellentesque elit ullamcorper dignissim cras tincidunt. Pellentesque dignissim enim sit amet venenatis urna. A cras semper auctor neque vitae tempus. Amet massa vitae tortor condimentum lacinia quis vel eros donec. Tempor commodo ullamcorper a lacus. Nibh tellus molestie nunc non blandit massa enim nec dui. Viverra orci sagittis eu volutpat odio facilisis mauris sit. Sed augue lacus viverra vitae. Vulputate eu scelerisque felis imperdiet proin fermentum leo vel orci. Tellus rutrum tellus pellentesque eu tincidunt tortor. Cras semper auctor neque vitae tempus quam pellentesque nec. Lorem ipsum dolor sit amet consectetur adipiscing elit ut aliquam. Tristique magna sit amet purus gravida quis blandit turpis. Viverra ipsum nunc aliquet bibendum. Arcu bibendum at varius vel. Amet mattis vulputate enim nulla. Vulputate enim nulla aliquet porttitor. Volutpat blandit aliquam etiam erat velit scelerisque in dictum. Morbi tristique senectus et netus et malesuada fames ac. Faucibus et molestie ac feugiat sed. Tellus elementum sagittis vitae et leo duis. Id aliquet lectus proin nibh. Ornare arcu dui vivamus arcu. Morbi tincidunt augue interdum velit euismod in pellentesque massa placerat. Quis eleifend quam adipiscing vitae. Tristique senectus et netus et malesuada fames ac turpis. Pharetra convallis posuere morbi leo. Ornare arcu odio ut sem nulla pharetra diam sit. Morbi tristique senectus et netus et. Dictum non consectetur a erat nam at lectus urna. Varius vel pharetra vel turpis. Mi ipsum faucibus vitae aliquet. Tellus in metus vulputate eu scelerisque felis imperdiet proin. In est ante in nibh mauris cursus mattis. Massa ultricies mi quis hendrerit dolor magna eget. Fermentum leo vel orci porta. Elit ut aliquam purus sit amet luctus venenatis lectus. Eget aliquet nibh praesent tristique magna sit amet. Arcu non odio euismod lacinia at quis. Montes nascetur ridiculus mus mauris vitae ultricies. Tempus quam pellentesque nec nam aliquam sem et tortor. Morbi leo urna molestie at elementum eu facilisis sed. In fermentum posuere urna nec tincidunt. Neque aliquam vestibulum morbi blandit cursus risus. Vulputate dignissim suspendisse in est ante in nibh mauris cursus. Lorem ipsum dolor sit amet consectetur adipiscing. Orci eu lobortis elementum nibh tellus molestie nunc non. Enim diam vulputate ut pharetra sit amet aliquam. Convallis convallis tellus id interdum velit laoreet id donec ultrices. Sit amet mattis vulputate enim nulla aliquet porttitor lacus luctus. A lacus vestibulum sed arcu non odio. Ut tortor pretium viverra suspendisse potenti nullam ac tortor. Diam vel quam elementum pulvinar etiam non quam. Viverra justo nec ultrices dui. Eu volutpat odio facilisis mauris sit amet massa. Sed ullamcorper morbi tincidunt ornare massa eget egestas purus. Ac felis donec et odio pellentesque. Nisl vel pretium lectus quam id leo in. Ultricies lacus sed turpis tincidunt id. At urna condimentum mattis pellentesque id nibh tortor id. Sem nulla pharetra diam sit amet nisl suscipit. Neque viverra justo nec ultrices. Arcu cursus euismod quis viverra nibh cras pulvinar. Dolor sit amet consectetur adipiscing elit ut aliquam purus. Id diam vel quam elementum pulvinar etiam non. Elementum pulvinar etiam non quam lacus suspendisse faucibus. Id aliquet lectus proin nibh nisl condimentum id venenatis. Sit amet consectetur adipiscing elit duis tristique sollicitudin nibh. Sed faucibus turpis in eu mi bibendum neque egestas congue. Consectetur libero id faucibus nisl tincidunt eget nullam. At volutpat diam ut venenatis tellus in metus vulputate eu. Condimentum lacinia quis vel eros donec ac odio. Sit amet porttitor eget dolor morbi non arcu risus quis. Viverra mauris in aliquam sem fringilla ut morbi tincidunt. Metus dictum at tempor commodo ullamcorper. At ultrices mi tempus imperdiet nulla. Est ullamcorper eget nulla facilisi etiam dignissim diam quis. Lobortis elementum nibh tellus molestie nunc non. Placerat in egestas erat imperdiet sed. Placerat in egestas erat imperdiet sed euismod. Lobortis feugiat vivamus at augue eget arcu dictum varius. Ut sem nulla pharetra diam sit amet. Et tortor at risus viverra adipiscing at in. Tempor nec feugiat nisl pretium. Cursus euismod quis viverra nibh. Eget mi proin sed libero enim sed. Aliquam id diam maecenas ultricies. Mi tempus imperdiet nulla malesuada pellentesque elit eget. Gravida quis blandit turpis cursus in hac habitasse platea dictumst. Sed tempus urna et pharetra pharetra massa massa. Dolor purus non enim praesent elementum facilisis leo vel. Pharetra vel turpis nunc eget. Quam pellentesque nec nam aliquam sem et tortor consequat id. Orci eu lobortis elementum nibh tellus molestie nunc non. Porttitor leo a diam sollicitudin tempor id. Tincidunt ornare massa eget egestas purus viverra accumsan in nisl. Quam lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Elit ut aliquam purus sit amet luctus venenatis lectus. Velit egestas dui id ornare arcu odio ut sem nulla. Lacus viverra vitae congue eu consequat ac felis donec. Nulla aliquet porttitor lacus luctus accumsan tortor posuere ac ut. Lorem dolor sed viverra ipsum. Blandit libero volutpat sed cras ornare arcu. Egestas erat imperdiet sed euismod nisi porta lorem mollis. Viverra maecenas accumsan lacus vel. Enim neque volutpat ac tincidunt. Porttitor massa id neque aliquam vestibulum morbi blandit cursus risus. Malesuada bibendum arcu vitae elementum curabitur vitae nunc. Et malesuada fames ac turpis egestas integer. Egestas egestas fringilla phasellus faucibus scelerisque eleifend donec pretium. Est placerat in egestas erat imperdiet sed. Non arcu risus quis varius quam quisque. Lorem mollis aliquam ut porttitor leo a. Viverra tellus in hac habitasse platea dictumst vestibulum rhoncus. Fermentum iaculis eu non diam. Erat imperdiet sed euismod nisi porta lorem mollis aliquam. Varius vel pharetra vel turpis nunc eget lorem dolor. Rhoncus mattis rhoncus urna neque viverra. Hac habitasse platea dictumst quisque sagittis purus sit. At quis risus sed vulputate odio ut enim. Pharetra magna ac placerat vestibulum lectus mauris ultrices eros. Rutrum quisque non tellus orci ac auctor. Iaculis eu non diam phasellus vestibulum lorem sed. Ut sem nulla pharetra diam sit amet nisl suscipit. Risus at ultrices mi tempus. Vitae tortor condimentum lacinia quis vel eros donec. Sed tempus urna et pharetra. Posuere sollicitudin aliquam ultrices sagittis orci. Congue quisque egestas diam in arcu. Hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Pellentesque habitant morbi tristique senectus et netus et. Id interdum velit laoreet id. Fusce ut placerat orci nulla pellentesque dignissim. Pretium nibh ipsum consequat nisl vel pretium. Etiam erat velit scelerisque in dictum non consectetur a. Turpis in eu mi bibendum neque egestas congue quisque egestas. Pulvinar sapien et ligula ullamcorper malesuada. Ultricies tristique nulla aliquet enim tortor at. Suspendisse interdum consectetur libero id faucibus. Lorem sed risus ultricies tristique nulla aliquet. Tristique senectus et netus et malesuada fames. Eu augue ut lectus arcu bibendum at varius vel. Egestas sed tempus urna et pharetra pharetra massa massa ultricies. Aliquet eget sit amet tellus cras adipiscing. Massa placerat duis ultricies lacus sed turpis tincidunt id aliquet. Ornare massa eget egestas purus viverra accumsan in nisl. Justo laoreet sit amet cursus sit amet. In metus vulputate eu scelerisque felis imperdiet proin. At erat pellentesque adipiscing commodo elit at. Ipsum suspendisse ultrices gravida dictum fusce. Lectus sit amet est placerat in egestas erat. Aliquam ultrices sagittis orci a. Sagittis id consectetur purus ut faucibus pulvinar elementum. Ornare arcu odio ut sem nulla pharetra diam. Sit amet purus gravida quis blandit turpis cursus. Duis ultricies lacus sed turpis tincidunt. Malesuada fames ac turpis egestas sed tempus urna et. Viverra ipsum nunc aliquet bibendum enim facilisis. Et pharetra pharetra massa massa ultricies mi quis. Eget duis at tellus at urna condimentum mattis. Euismod in pellentesque massa placerat. Enim nunc faucibus a pellentesque sit amet porttitor. Dolor sed viverra ipsum nunc aliquet. Donec enim diam vulputate ut pharetra sit amet. Feugiat sed lectus vestibulum mattis ullamcorper velit sed. Erat pellentesque adipiscing commodo elit at imperdiet. Nisl purus in mollis nunc sed id semper risus. Tincidunt augue interdum velit euismod in pellentesque massa. Facilisis magna etiam tempor orci. Mauris in aliquam sem fringilla ut. Gravida dictum fusce ut placerat orci. Sed risus ultricies tristique nulla. Odio morbi quis commodo odio. Feugiat in ante metus dictum at tempor commodo ullamcorper. Porta non pulvinar neque laoreet suspendisse interdum. Etiam tempor orci eu lobortis elementum. Fusce ut placerat orci nulla pellentesque dignissim. Ornare lectus sit amet est placerat in egestas erat. Quis vel eros donec ac. Elementum pulvinar etiam non quam lacus. Sit amet tellus cras adipiscing enim eu turpis. Amet tellus cras adipiscing enim eu. Sed faucibus turpis in eu mi bibendum. Lectus proin nibh nisl condimentum id. Sollicitudin nibh sit amet commodo nulla. Sed tempus urna et pharetra pharetra massa massa. Magna eget est lorem ipsum. Elit ullamcorper dignissim cras tincidunt lobortis feugiat vivamus at. Fermentum dui faucibus in ornare quam viverra orci sagittis eu. Dignissim convallis aenean et tortor. Ut faucibus pulvinar elementum integer enim neque. Nibh cras pulvinar mattis nunc sed. Pellentesque sit amet porttitor eget dolor morbi. Mi eget mauris pharetra et ultrices neque ornare aenean euismod. Quis risus sed vulputate odio ut enim blandit volutpat. Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. In vitae turpis massa sed elementum tempus egestas sed sed. Urna id volutpat lacus laoreet non. Egestas pretium aenean pharetra magna ac placerat. Amet commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Donec et odio pellentesque diam volutpat commodo sed. Etiam non quam lacus suspendisse. Augue neque gravida in fermentum et sollicitudin ac orci. Eu feugiat pretium nibh ipsum. Nam at lectus urna duis convallis convallis tellus id. Egestas integer eget aliquet nibh. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae auctor. Urna condimentum mattis pellentesque id nibh tortor id. In egestas erat imperdiet sed euismod. Ut sem viverra aliquet eget sit amet tellus. Feugiat pretium nibh ipsum consequat nisl vel pretium. Volutpat odio facilisis mauris sit amet. Mi sit amet mauris commodo quis imperdiet massa tincidunt. Neque volutpat ac tincidunt vitae semper quis lectus nulla at. Nec feugiat in fermentum posuere urna nec. Ut venenatis tellus in metus vulputate eu. Vestibulum rhoncus est pellentesque elit ullamcorper dignissim. Eu scelerisque felis imperdiet proin. Vitae et leo duis ut diam quam nulla. Ut venenatis tellus in metus vulputate eu scelerisque. Tincidunt dui ut ornare lectus sit amet. Adipiscing diam donec adipiscing tristique risus. Turpis nunc eget lorem dolor sed viverra ipsum nunc aliquet. Non sodales neque sodales ut. Massa placerat duis ultricies lacus sed turpis tincidunt. Viverra orci sagittis eu volutpat odio facilisis mauris sit amet. Adipiscing vitae proin sagittis nisl. Vitae aliquet nec ullamcorper sit. Potenti nullam ac tortor vitae purus. Ultricies lacus sed turpis tincidunt id. Ut diam quam nulla porttitor massa id neque aliquam vestibulum. Semper eget duis at tellus at urna condimentum mattis pellentesque. Nec tincidunt praesent semper feugiat nibh sed pulvinar proin. Dictum fusce ut placerat orci nulla pellentesque dignissim. Amet luctus venenatis lectus magna fringilla urna. Quam quisque id diam vel quam elementum pulvinar. At tempor commodo ullamcorper a. Magna etiam tempor orci eu lobortis. Suspendisse ultrices gravida dictum fusce. Massa ultricies mi quis hendrerit dolor magna. Massa tincidunt nunc pulvinar sapien et ligula ullamcorper malesuada proin. Aliquet enim tortor at auctor urna nunc id. Semper feugiat nibh sed pulvinar proin gravida. Porttitor rhoncus dolor purus non enim. Metus aliquam eleifend mi in nulla. Lectus arcu bibendum at varius vel pharetra. Sed vulputate odio ut enim blandit volutpat. Et ligula ullamcorper malesuada proin libero nunc consequat interdum varius. Donec et odio pellentesque diam volutpat commodo. Id ornare arcu odio ut sem nulla pharetra diam sit. Est ullamcorper eget nulla facilisi etiam dignissim diam quis enim. Sagittis vitae et leo duis ut diam quam nulla. Elementum nisi quis eleifend quam. Congue mauris rhoncus aenean vel elit. Adipiscing elit duis tristique sollicitudin nibh sit. Egestas egestas fringilla phasellus faucibus scelerisque. Morbi tincidunt augue interdum velit euismod. Massa sed elementum tempus egestas sed sed. Id leo in vitae turpis massa sed elementum tempus egestas. In pellentesque massa placerat duis ultricies lacus sed turpis. Vitae proin sagittis nisl rhoncus mattis rhoncus. Enim tortor at auctor urna nunc id. In fermentum posuere urna nec tincidunt praesent semper feugiat nibh. Aliquam ut porttitor leo a diam sollicitudin tempor id. Pellentesque elit eget gravida cum sociis natoque. Molestie at elementum eu facilisis sed odio morbi quis. Tristique senectus et netus et malesuada fames ac turpis. Proin libero nunc consequat interdum varius sit amet mattis. Pellentesque id nibh tortor id. Risus sed vulputate odio ut enim blandit. Laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt eget. Morbi tincidunt augue interdum velit euismod in pellentesque. Pharetra pharetra massa massa ultricies mi quis hendrerit. Nunc aliquet bibendum enim facilisis gravida neque. Feugiat sed lectus vestibulum mattis ullamcorper velit sed ullamcorper. Risus quis varius quam quisque id diam vel. Et ultrices neque ornare aenean. Aliquet sagittis id consectetur purus ut faucibus pulvinar elementum. Nibh ipsum consequat nisl vel. Mauris rhoncus aenean vel elit scelerisque mauris pellentesque pulvinar. Ornare quam viverra orci sagittis eu volutpat odio facilisis. Euismod nisi porta lorem mollis aliquam. Enim ut tellus elementum sagittis. Rhoncus mattis rhoncus urna neque. Malesuada fames ac turpis egestas. Cursus in hac habitasse platea dictumst quisque sagittis. Sit amet aliquam id diam maecenas ultricies mi eget mauris. Enim sit amet venenatis urna cursus eget nunc. Fermentum odio eu feugiat pretium nibh ipsum consequat. Eu scelerisque felis imperdiet proin. Nullam non nisi est sit amet facilisis magna etiam tempor. In mollis nunc sed id semper risus in hendrerit. Sollicitudin nibh sit amet commodo nulla facilisi nullam. Sit amet nisl purus in mollis nunc sed id. Nam libero justo laoreet sit amet cursus sit amet dictum. Condimentum id venenatis a condimentum vitae sapien pellentesque. Porta nibh venenatis cras sed felis. Lectus nulla at volutpat diam ut venenatis tellus in. Aliquam etiam erat velit scelerisque in dictum non consectetur a. Leo vel fringilla est ullamcorper eget. Sodales ut etiam sit amet nisl purus in mollis nunc. Euismod nisi porta lorem mollis aliquam. Ornare arcu odio ut sem nulla. Sed felis eget velit aliquet sagittis id consectetur. Pellentesque nec nam aliquam sem et tortor consequat id. Enim nec dui nunc mattis enim ut tellus elementum. Nullam non nisi est sit amet facilisis magna. Rutrum quisque non tellus orci ac auctor augue. Nunc vel risus commodo viverra maecenas accumsan lacus. Viverra vitae congue eu consequat. Sollicitudin nibh sit amet commodo nulla. Amet volutpat consequat mauris nunc congue nisi. Maecenas pharetra convallis posuere morbi leo urna molestie at. Mattis vulputate enim nulla aliquet porttitor lacus luctus accumsan tortor. Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc consequat. Adipiscing diam donec adipiscing tristique risus. Elementum curabitur vitae nunc sed velit dignissim sodales ut. Eleifend donec pretium vulputate sapien nec. Commodo quis imperdiet massa tincidunt nunc pulvinar. Proin libero nunc consequat interdum varius sit amet mattis. Facilisis gravida neque convallis a cras semper auctor neque vitae. Quisque egestas diam in arcu cursus. Nunc eget lorem dolor sed viverra ipsum. Mauris sit amet massa vitae tortor condimentum lacinia quis vel. Aliquam sem et tortor consequat id porta nibh venenatis cras. Nunc sed id semper risus in. Enim sed faucibus turpis in eu mi bibendum neque. Molestie nunc non blandit massa enim. Enim praesent elementum facilisis leo vel fringilla est ullamcorper. Semper risus in hendrerit gravida rutrum quisque non tellus orci. Ac turpis egestas maecenas pharetra. In nulla posuere sollicitudin aliquam. Justo nec ultrices dui sapien eget mi proin sed libero. In ornare quam viverra orci sagittis eu. Proin nibh nisl condimentum id venenatis. Morbi enim nunc faucibus a pellentesque sit amet porttitor eget. Quis risus sed vulputate odio ut enim blandit. Risus feugiat in ante metus dictum at tempor commodo. Sodales neque sodales ut etiam. Nunc id cursus metus aliquam. Gravida dictum fusce ut placerat orci nulla pellentesque dignissim enim. Augue ut lectus arcu bibendum at. Quis varius quam quisque id diam vel quam. Egestas congue quisque egestas diam in arcu. Condimentum mattis pellentesque id nibh tortor id aliquet lectus. Enim lobortis scelerisque fermentum dui faucibus in. In tellus integer feugiat scelerisque varius morbi enim nunc. Mattis molestie a iaculis at erat pellentesque. Elit scelerisque mauris pellentesque pulvinar pellentesque habitant morbi tristique. Lorem ipsum dolor sit amet consectetur adipiscing elit ut aliquam. Nisl rhoncus mattis rhoncus urna neque. Ac auctor augue mauris augue neque gravida in fermentum et. Sodales ut eu sem integer vitae justo eget. Sed egestas egestas fringilla phasellus. Viverra adipiscing at in tellus integer feugiat scelerisque varius. Purus gravida quis blandit turpis. Id porta nibh venenatis cras sed. Mattis vulputate enim nulla aliquet porttitor lacus. Augue eget arcu dictum varius duis at consectetur lorem donec. Nulla at volutpat diam ut venenatis tellus in metus. Aliquam etiam erat velit scelerisque in dictum non consectetur. Turpis cursus in hac habitasse platea dictumst. Consequat mauris nunc congue nisi vitae suscipit tellus. Volutpat maecenas volutpat blandit aliquam etiam. Massa massa ultricies mi quis hendrerit dolor magna eget est. Velit egestas dui id ornare arcu. Non consectetur a erat nam at. Orci sagittis eu volutpat odio facilisis mauris sit amet. Dui id ornare arcu odio. Sed arcu non odio euismod lacinia. Feugiat in ante metus dictum. Gravida arcu ac tortor dignissim convallis. Egestas sed tempus urna et pharetra pharetra massa massa. Nulla facilisi nullam vehicula ipsum a arcu. Ipsum a arcu cursus vitae congue mauris. Porttitor rhoncus dolor purus non. Magna sit amet purus gravida quis blandit. Sapien eget mi proin sed libero enim sed faucibus turpis. Nisl nunc mi ipsum faucibus vitae aliquet nec ullamcorper sit. Pellentesque dignissim enim sit amet venenatis urna cursus eget. Pharetra massa massa ultricies mi quis hendrerit. Sapien nec sagittis aliquam malesuada bibendum. Nunc scelerisque viverra mauris in aliquam sem fringilla ut. Dolor magna eget est lorem ipsum dolor. Amet commodo nulla facilisi nullam. Pellentesque elit ullamcorper dignissim cras. Id porta nibh venenatis cras sed felis eget. Nam at lectus urna duis. Laoreet non curabitur gravida arcu ac tortor dignissim convallis. Nunc lobortis mattis aliquam faucibus purus in massa tempor. Sit amet luctus venenatis lectus magna fringilla. Duis ultricies lacus sed turpis tincidunt id. Sed velit dignissim sodales ut eu. Ut tortor pretium viverra suspendisse potenti nullam. Iaculis at erat pellentesque adipiscing. Ipsum nunc aliquet bibendum enim facilisis gravida neque. Nulla aliquet enim tortor at auctor urna nunc id cursus. Amet cursus sit amet dictum sit amet justo donec enim. Enim nunc faucibus a pellentesque sit amet porttitor eget dolor. Pharetra magna ac placerat vestibulum lectus mauris ultrices eros in. Nulla facilisi etiam dignissim diam quis enim. Ut enim blandit volutpat maecenas volutpat blandit aliquam etiam erat. Imperdiet proin fermentum leo vel orci porta non pulvinar neque. Vel fringilla est ullamcorper eget nulla. Bibendum neque egestas congue quisque egestas diam in arcu cursus. Ipsum nunc aliquet bibendum enim facilisis gravida neque convallis a. Arcu cursus vitae congue mauris rhoncus aenean vel elit. Augue eget arcu dictum varius duis. Tristique et egestas quis ipsum. Quis varius quam quisque id. Varius sit amet mattis vulputate. Mattis molestie a iaculis at erat pellentesque. Libero justo laoreet sit amet cursus. Aliquam id diam maecenas ultricies mi eget mauris pharetra. Ut eu sem integer vitae justo eget. Fames ac turpis egestas sed. Suspendisse in est ante in nibh mauris cursus mattis. Faucibus pulvinar elementum integer enim neque volutpat ac tincidunt vitae. Neque vitae tempus quam pellentesque nec nam aliquam. Lobortis elementum nibh tellus molestie nunc non. Lacus vel facilisis volutpat est velit egestas dui. Justo laoreet sit amet cursus sit amet dictum sit amet. Adipiscing enim eu turpis egestas pretium aenean pharetra magna. Cursus metus aliquam eleifend mi in nulla posuere. Nibh mauris cursus mattis molestie a. Dignissim diam quis enim lobortis scelerisque fermentum. A scelerisque purus semper eget duis at tellus. Lacus sed turpis tincidunt id aliquet risus feugiat in. Non tellus orci ac auctor. Ultrices in iaculis nunc sed augue lacus. Tincidunt tortor aliquam nulla facilisi cras. Nulla facilisi nullam vehicula ipsum a arcu cursus vitae congue. Eget magna fermentum iaculis eu non diam phasellus. Pharetra massa massa ultricies mi quis. Eget mauris pharetra et ultrices neque ornare. Aliquam faucibus purus in massa. Facilisi morbi tempus iaculis urna id volutpat lacus. Accumsan lacus vel facilisis volutpat. Curabitur gravida arcu ac tortor. Quam lacus suspendisse faucibus interdum. Elementum nibh tellus molestie nunc non blandit massa enim. Libero id faucibus nisl tincidunt. Bibendum ut tristique et egestas. Ut diam quam nulla porttitor massa id neque aliquam vestibulum. Augue interdum velit euismod in pellentesque. Adipiscing diam donec adipiscing tristique risus nec feugiat. Fringilla ut morbi tincidunt augue interdum velit. Vitae et leo duis ut diam quam nulla porttitor massa. Egestas integer eget aliquet nibh praesent tristique. Posuere sollicitudin aliquam ultrices sagittis orci a. Nisi est sit amet facilisis. Risus quis varius quam quisque id diam. Faucibus turpis in eu mi. Et molestie ac feugiat sed lectus vestibulum. Porttitor lacus luctus accumsan tortor posuere ac. Platea dictumst vestibulum rhoncus est pellentesque. Tortor pretium viverra suspendisse potenti nullam ac tortor. Enim praesent elementum facilisis leo vel fringilla est. Proin libero nunc consequat interdum varius sit amet mattis vulputate. Turpis egestas pretium aenean pharetra magna ac placerat vestibulum lectus. Nulla pharetra diam sit amet nisl suscipit. Mauris nunc congue nisi vitae suscipit tellus mauris a diam. Faucibus in ornare quam viverra orci sagittis eu volutpat. Volutpat consequat mauris nunc congue nisi vitae. Dui nunc mattis enim ut tellus. Adipiscing elit ut aliquam purus sit amet luctus. Tempus egestas sed sed risus. Scelerisque fermentum dui faucibus in ornare quam viverra orci. Massa ultricies mi quis hendrerit dolor magna eget. Pulvinar mattis nunc sed blandit libero volutpat sed cras ornare. Ut eu sem integer vitae justo eget magna fermentum. Ornare quam viverra orci sagittis. Eget dolor morbi non arcu risus quis varius quam. Tincidunt praesent semper feugiat nibh sed pulvinar. Sit amet justo donec enim diam vulputate. Dui faucibus in ornare quam viverra. Tincidunt tortor aliquam nulla facilisi cras fermentum odio eu. Turpis egestas sed tempus urna et. Pretium quam vulputate dignissim suspendisse in est ante in. Morbi quis commodo odio aenean sed adipiscing diam donec. Nunc mattis enim ut tellus elementum sagittis vitae et. Diam vel quam elementum pulvinar etiam non quam. Convallis posuere morbi leo urna molestie at elementum eu. Adipiscing at in tellus integer feugiat scelerisque varius morbi. Quis varius quam quisque id diam vel quam elementum. Dui accumsan sit amet nulla. Adipiscing elit duis tristique sollicitudin nibh sit amet commodo. Viverra ipsum nunc aliquet bibendum enim facilisis. Porta lorem mollis aliquam ut. Velit ut tortor pretium viverra suspendisse potenti. Quis viverra nibh cras pulvinar mattis nunc sed blandit. Pharetra magna ac placerat vestibulum. Mauris ultrices eros in cursus turpis massa. Lacus vestibulum sed arcu non odio euismod lacinia at. Dapibus ultrices in iaculis nunc sed. Cras adipiscing enim eu turpis egestas. Eget arcu dictum varius duis at consectetur. Consequat id porta nibh venenatis cras sed felis eget velit. Integer enim neque volutpat ac tincidunt vitae. Feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Ut morbi tincidunt augue interdum velit euismod. Sed cras ornare arcu dui vivamus arcu felis bibendum ut. Eget felis eget nunc lobortis mattis aliquam faucibus purus in. Luctus venenatis lectus magna fringilla urna porttitor rhoncus dolor. Nisl nunc mi ipsum faucibus vitae. Proin fermentum leo vel orci porta. Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Et leo duis ut diam quam. Eros in cursus turpis massa tincidunt. Volutpat est velit egestas dui id. Commodo odio aenean sed adipiscing diam. Quis blandit turpis cursus in hac habitasse platea dictumst quisque. Magna fringilla urna porttitor rhoncus dolor. Amet consectetur adipiscing elit ut aliquam purus sit amet. Vitae justo eget magna fermentum iaculis eu non diam. Hendrerit dolor magna eget est. Ac placerat vestibulum lectus mauris ultrices eros in cursus turpis. Egestas diam in arcu cursus. At varius vel pharetra vel turpis nunc. Lacus vel facilisis volutpat est velit. Ut ornare lectus sit amet est placerat in egestas. Quam adipiscing vitae proin sagittis nisl rhoncus. Dolor purus non enim praesent. Urna condimentum mattis pellentesque id. Magnis dis parturient montes nascetur ridiculus. Feugiat nisl pretium fusce id. Sed cras ornare arcu dui vivamus. Vitae turpis massa sed elementum tempus egestas sed sed. Ac feugiat sed lectus vestibulum mattis ullamcorper velit sed ullamcorper. Ac ut consequat semper viverra nam libero. Consectetur lorem donec massa sapien faucibus. Purus viverra accumsan in nisl nisi scelerisque eu ultrices. Eu turpis egestas pretium aenean pharetra. Nisl rhoncus mattis rhoncus urna neque viverra justo nec ultrices. Pellentesque sit amet porttitor eget dolor morbi non arcu. Vitae justo eget magna fermentum iaculis. Quis auctor elit sed vulputate mi sit. Purus viverra accumsan in nisl nisi scelerisque eu ultrices. Semper auctor neque vitae tempus quam pellentesque nec nam. Rhoncus dolor purus non enim. Sed turpis tincidunt id aliquet risus feugiat. Sit amet justo donec enim diam vulputate ut pharetra sit. Risus pretium quam vulputate dignissim suspendisse in est ante in. Massa sapien faucibus et molestie ac feugiat. Id aliquet risus feugiat in ante metus. Risus ultricies tristique nulla aliquet enim tortor at auctor urna. Sed lectus vestibulum mattis ullamcorper velit sed ullamcorper morbi. Lacus sed turpis tincidunt id aliquet risus feugiat in. Risus ultricies tristique nulla aliquet enim tortor. In ornare quam viverra orci sagittis eu volutpat. Netus et malesuada fames ac turpis egestas sed tempus urna. Fames ac turpis egestas maecenas pharetra convallis posuere morbi. Etiam erat velit scelerisque in dictum non. Cursus turpis massa tincidunt dui ut ornare lectus. Tristique sollicitudin nibh sit amet commodo nulla facilisi. Pellentesque pulvinar pellentesque habitant morbi tristique senectus et. Aliquet eget sit amet tellus cras. Nullam ac tortor vitae purus faucibus ornare. Lacus viverra vitae congue eu consequat. Vulputate ut pharetra sit amet. Est ante in nibh mauris cursus mattis molestie a. Ipsum suspendisse ultrices gravida dictum fusce ut placerat orci. Et tortor at risus viverra. Sed libero enim sed faucibus turpis in eu. Id cursus metus aliquam eleifend mi in nulla posuere sollicitudin. Risus viverra adipiscing at in. Imperdiet massa tincidunt nunc pulvinar sapien et. Nec feugiat in fermentum posuere urna nec tincidunt. Ultricies mi eget mauris pharetra et. Morbi tristique senectus et netus et malesuada fames ac. At quis risus sed vulputate. Interdum velit laoreet id donec. Sapien pellentesque habitant morbi tristique. Pharetra vel turpis nunc eget lorem dolor sed viverra. In massa tempor nec feugiat nisl. Massa tincidunt nunc pulvinar sapien et ligula ullamcorper malesuada proin. Mauris augue neque gravida in. Faucibus vitae aliquet nec ullamcorper sit amet risus. Id velit ut tortor pretium viverra suspendisse potenti. Leo integer malesuada nunc vel risus commodo viverra maecenas. Risus quis varius quam quisque id. Aliquam malesuada bibendum arcu vitae elementum curabitur vitae. Vestibulum lectus mauris ultrices eros in cursus turpis. Fermentum posuere urna nec tincidunt. Magna etiam tempor orci eu lobortis elementum nibh tellus molestie. Id ornare arcu odio ut. Facilisi nullam vehicula ipsum a arcu cursus vitae congue. Nulla pellentesque dignissim enim sit amet venenatis urna cursus eget. Viverra mauris in aliquam sem fringilla ut morbi tincidunt. Quis ipsum suspendisse ultrices gravida dictum fusce ut placerat orci. Sed cras ornare arcu dui vivamus arcu felis. Egestas diam in arcu cursus euismod quis. Tincidunt dui ut ornare lectus. Morbi tristique senectus et netus et. Ornare arcu dui vivamus arcu felis bibendum ut tristique. Habitant morbi tristique senectus et netus et malesuada fames ac. Ut tristique et egestas quis. Mollis aliquam ut porttitor leo. Venenatis tellus in metus vulputate eu scelerisque felis imperdiet proin. Sagittis eu volutpat odio facilisis mauris sit amet massa. Eu facilisis sed odio morbi. Nunc consequat interdum varius sit amet mattis. Velit dignissim sodales ut eu. Pellentesque eu tincidunt tortor aliquam. Porta lorem mollis aliquam ut porttitor. Rhoncus urna neque viverra justo nec ultrices. Viverra suspendisse potenti nullam ac tortor vitae purus. Fermentum posuere urna nec tincidunt praesent semper feugiat nibh sed. Purus sit amet luctus venenatis lectus magna fringilla urna porttitor. Sed lectus vestibulum mattis ullamcorper velit sed ullamcorper. Nulla posuere sollicitudin aliquam ultrices sagittis orci a scelerisque. Nisl nisi scelerisque eu ultrices vitae auctor. In vitae turpis massa sed elementum tempus egestas. Cursus sit amet dictum sit amet justo donec enim. Vitae congue eu consequat ac felis donec et. Augue interdum velit euismod in pellentesque massa placerat. Enim ut sem viverra aliquet eget sit amet. Velit scelerisque in dictum non consectetur a erat. Sed lectus vestibulum mattis ullamcorper velit sed ullamcorper. Nunc faucibus a pellentesque sit amet porttitor eget. Tellus integer feugiat scelerisque varius morbi. Lorem sed risus ultricies tristique nulla aliquet enim tortor at. Eget nulla facilisi etiam dignissim diam quis enim lobortis scelerisque. Adipiscing elit duis tristique sollicitudin. Adipiscing elit pellentesque habitant morbi tristique. Ac tincidunt vitae semper quis lectus nulla at. Maecenas sed enim ut sem viverra. Erat pellentesque adipiscing commodo elit at imperdiet. Dolor morbi non arcu risus quis varius quam quisque. Fringilla urna porttitor rhoncus dolor purus non enim praesent. Tellus integer feugiat scelerisque varius morbi enim nunc faucibus a. Felis eget nunc lobortis mattis aliquam faucibus purus in. Fringilla phasellus faucibus scelerisque eleifend. Pulvinar etiam non quam lacus suspendisse faucibus interdum posuere. Risus ultricies tristique nulla aliquet. Lectus sit amet est placerat. Ac ut consequat semper viverra nam libero justo. Dapibus ultrices in iaculis nunc sed augue. Mattis ullamcorper velit sed ullamcorper. Eget nullam non nisi est. Vitae elementum curabitur vitae nunc sed velit. Sit amet commodo nulla facilisi nullam vehicula ipsum a arcu. Tempor nec feugiat nisl pretium fusce id velit ut. Nulla pellentesque dignissim enim sit amet venenatis. Sed tempus urna et pharetra pharetra. Congue quisque egestas diam in. Convallis posuere morbi leo urna. Nec tincidunt praesent semper feugiat nibh sed pulvinar proin gravida. Sagittis nisl rhoncus mattis rhoncus urna neque viverra justo. Scelerisque felis imperdiet proin fermentum leo vel. Ut placerat orci nulla pellentesque dignissim enim sit amet. In cursus turpis massa tincidunt dui. Rutrum quisque non tellus orci ac auctor augue mauris augue. Cursus vitae congue mauris rhoncus aenean vel elit scelerisque mauris. Scelerisque fermentum dui faucibus in ornare quam viverra orci. Habitant morbi tristique senectus et netus et. Ridiculus mus mauris vitae ultricies leo. Vitae semper quis lectus nulla at volutpat diam. Purus faucibus ornare suspendisse sed nisi. Enim lobortis scelerisque fermentum dui faucibus in ornare quam. Mi tempus imperdiet nulla malesuada pellentesque elit eget. Varius duis at consectetur lorem donec. Pulvinar pellentesque habitant morbi tristique senectus et netus et. A iaculis at erat pellentesque adipiscing commodo elit at imperdiet. Mi ipsum faucibus vitae aliquet nec. Libero volutpat sed cras ornare arcu dui vivamus arcu. Natoque penatibus et magnis dis parturient montes nascetur ridiculus. Maecenas volutpat blandit aliquam etiam erat velit scelerisque. Cras adipiscing enim eu turpis. Nec tincidunt praesent semper feugiat nibh sed pulvinar. Justo laoreet sit amet cursus sit amet dictum sit. Velit scelerisque in dictum non consectetur a erat nam. Turpis tincidunt id aliquet risus feugiat in ante. Aliquet risus feugiat in ante metus dictum. Hac habitasse platea dictumst quisque sagittis purus sit. Et pharetra pharetra massa massa ultricies. Sit amet nisl suscipit adipiscing bibendum est ultricies integer. Venenatis urna cursus eget nunc scelerisque viverra mauris in. Integer quis auctor elit sed. In est ante in nibh mauris cursus mattis molestie. Scelerisque in dictum non consectetur a erat nam at. Lectus sit amet est placerat in. Sit amet cursus sit amet. Nibh nisl condimentum id venenatis a condimentum. Purus ut faucibus pulvinar elementum integer enim. Pharetra sit amet aliquam id diam maecenas. Id cursus metus aliquam eleifend mi in nulla posuere. Lobortis mattis aliquam faucibus purus in massa tempor nec. Urna neque viverra justo nec ultrices dui sapien eget. Enim ut sem viverra aliquet eget sit amet. In eu mi bibendum neque egestas congue quisque egestas. Enim neque volutpat ac tincidunt. Orci ac auctor augue mauris augue neque gravida in fermentum. Velit aliquet sagittis id consectetur. Enim ut sem viverra aliquet eget sit amet tellus. Semper auctor neque vitae tempus quam pellentesque nec. Non blandit massa enim nec dui nunc. Morbi blandit cursus risus at ultrices mi tempus imperdiet nulla. Arcu non odio euismod lacinia at quis risus. Dictum varius duis at consectetur lorem donec massa. Blandit massa enim nec dui. Nibh ipsum consequat nisl vel. Turpis in eu mi bibendum neque. Ut tristique et egestas quis. Ac odio tempor orci dapibus. Gravida dictum fusce ut placerat orci nulla pellentesque dignissim. Integer feugiat scelerisque varius morbi enim. Libero volutpat sed cras ornare arcu dui. Odio aenean sed adipiscing diam. Et egestas quis ipsum suspendisse ultrices. Aliquet lectus proin nibh nisl condimentum. Sit amet consectetur adipiscing elit duis tristique sollicitudin nibh sit. Blandit massa enim nec dui. Tellus molestie nunc non blandit massa enim nec. Tortor vitae purus faucibus ornare suspendisse sed nisi. Nascetur ridiculus mus mauris vitae ultricies leo. Elementum facilisis leo vel fringilla est ullamcorper eget nulla. Diam maecenas ultricies mi eget. Duis tristique sollicitudin nibh sit amet commodo nulla. Tempus iaculis urna id volutpat lacus laoreet non curabitur gravida. Dictumst quisque sagittis purus sit amet. Viverra mauris in aliquam sem. Quis risus sed vulputate odio ut enim blandit volutpat maecenas. Condimentum mattis pellentesque id nibh tortor id. Non sodales neque sodales ut etiam sit amet. Ipsum consequat nisl vel pretium. Cursus in hac habitasse platea dictumst quisque sagittis purus sit. Fringilla est ullamcorper eget nulla facilisi etiam. Tellus elementum sagittis vitae et leo duis ut diam quam. Nisl vel pretium lectus quam id leo in." = "long"
diff --git a/tests/data/valid/toml-lang-compliance/valid/qa/qa-scalar-literal-40kb.json b/tests/data/valid/toml-lang-compliance/valid/qa/qa-scalar-literal-40kb.json
new file mode 100644
index 0000000..5b1d643
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/qa/qa-scalar-literal-40kb.json
@@ -0,0 +1,2 @@
+{"long":
+ {"type":"string","value":"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Quam lacus suspendisse faucibus interdum posuere lorem ipsum dolor. Amet consectetur adipiscing elit ut. Nulla facilisi etiam dignissim diam quis enim lobortis. Curabitur vitae nunc sed velit dignissim sodales ut eu. Fames ac turpis egestas sed tempus urna et. Facilisi cras fermentum odio eu feugiat pretium. Nec tincidunt praesent semper feugiat nibh sed pulvinar proin gravida. Est lorem ipsum dolor sit amet consectetur adipiscing elit. Vel quam elementum pulvinar etiam non quam lacus. Pharetra et ultrices neque ornare aenean euismod. Nisl nisi scelerisque eu ultrices. Eget dolor morbi non arcu risus. Bibendum neque egestas congue quisque egestas diam in arcu cursus. Faucibus nisl tincidunt eget nullam. Nisl pretium fusce id velit ut tortor pretium viverra suspendisse. Mauris ultrices eros in cursus. Donec ac odio tempor orci dapibus ultrices in iaculis. Tellus cras adipiscing enim eu turpis egestas pretium aenean pharetra. Eros in cursus turpis massa. Nascetur ridiculus mus mauris vitae ultricies leo integer malesuada nunc. Velit sed ullamcorper morbi tincidunt ornare massa eget egestas purus. Aenean euismod elementum nisi quis eleifend quam. Magnis dis parturient montes nascetur ridiculus mus. Eu tincidunt tortor aliquam nulla facilisi cras. Tristique senectus et netus et malesuada fames. Urna nec tincidunt praesent semper feugiat nibh sed pulvinar. Vitae ultricies leo integer malesuada nunc vel risus commodo viverra. Ac turpis egestas sed tempus urna et. Amet mauris commodo quis imperdiet massa tincidunt. Urna nunc id cursus metus aliquam eleifend mi. In nulla posuere sollicitudin aliquam ultrices sagittis orci a scelerisque. Neque aliquam vestibulum morbi blandit cursus. Pulvinar mattis nunc sed blandit libero volutpat sed. Sed egestas egestas fringilla phasellus faucibus scelerisque eleifend donec pretium. Blandit cursus risus at ultrices mi tempus. Turpis massa sed elementum tempus egestas sed sed. Dictum varius duis at consectetur lorem. Commodo ullamcorper a lacus vestibulum sed arcu non. Dolor magna eget est lorem. Tincidunt arcu non sodales neque sodales ut etiam sit amet. Sit amet risus nullam eget felis eget nunc lobortis. Risus in hendrerit gravida rutrum quisque non tellus orci. Elementum pulvinar etiam non quam lacus suspendisse faucibus. Morbi tristique senectus et netus et malesuada. In aliquam sem fringilla ut morbi tincidunt. Ornare aenean euismod elementum nisi quis eleifend quam. Sed id semper risus in hendrerit gravida rutrum quisque. Lorem ipsum dolor sit amet consectetur adipiscing elit. A condimentum vitae sapien pellentesque habitant morbi tristique senectus et. Faucibus purus in massa tempor nec feugiat nisl. Vehicula ipsum a arcu cursus vitae congue. Facilisi cras fermentum odio eu feugiat pretium nibh. Viverra mauris in aliquam sem fringilla ut morbi tincidunt. Ultrices dui sapien eget mi proin sed libero enim. Nisi est sit amet facilisis magna etiam tempor. Posuere ac ut consequat semper viverra nam. Dis parturient montes nascetur ridiculus mus mauris vitae. Nec sagittis aliquam malesuada bibendum. Mattis pellentesque id nibh tortor id aliquet lectus. Vitae congue eu consequat ac felis donec et. Cras sed felis eget velit aliquet sagittis id consectetur purus. Pellentesque elit ullamcorper dignissim cras tincidunt. Pellentesque dignissim enim sit amet venenatis urna. A cras semper auctor neque vitae tempus. Amet massa vitae tortor condimentum lacinia quis vel eros donec. Tempor commodo ullamcorper a lacus. Nibh tellus molestie nunc non blandit massa enim nec dui. Viverra orci sagittis eu volutpat odio facilisis mauris sit. Sed augue lacus viverra vitae. Vulputate eu scelerisque felis imperdiet proin fermentum leo vel orci. Tellus rutrum tellus pellentesque eu tincidunt tortor. Cras semper auctor neque vitae tempus quam pellentesque nec. Lorem ipsum dolor sit amet consectetur adipiscing elit ut aliquam. Tristique magna sit amet purus gravida quis blandit turpis. Viverra ipsum nunc aliquet bibendum. Arcu bibendum at varius vel. Amet mattis vulputate enim nulla. Vulputate enim nulla aliquet porttitor. Volutpat blandit aliquam etiam erat velit scelerisque in dictum. Morbi tristique senectus et netus et malesuada fames ac. Faucibus et molestie ac feugiat sed. Tellus elementum sagittis vitae et leo duis. Id aliquet lectus proin nibh. Ornare arcu dui vivamus arcu. Morbi tincidunt augue interdum velit euismod in pellentesque massa placerat. Quis eleifend quam adipiscing vitae. Tristique senectus et netus et malesuada fames ac turpis. Pharetra convallis posuere morbi leo. Ornare arcu odio ut sem nulla pharetra diam sit. Morbi tristique senectus et netus et. Dictum non consectetur a erat nam at lectus urna. Varius vel pharetra vel turpis. Mi ipsum faucibus vitae aliquet. Tellus in metus vulputate eu scelerisque felis imperdiet proin. In est ante in nibh mauris cursus mattis. Massa ultricies mi quis hendrerit dolor magna eget. Fermentum leo vel orci porta. Elit ut aliquam purus sit amet luctus venenatis lectus. Eget aliquet nibh praesent tristique magna sit amet. Arcu non odio euismod lacinia at quis. Montes nascetur ridiculus mus mauris vitae ultricies. Tempus quam pellentesque nec nam aliquam sem et tortor. Morbi leo urna molestie at elementum eu facilisis sed. In fermentum posuere urna nec tincidunt. Neque aliquam vestibulum morbi blandit cursus risus. Vulputate dignissim suspendisse in est ante in nibh mauris cursus. Lorem ipsum dolor sit amet consectetur adipiscing. Orci eu lobortis elementum nibh tellus molestie nunc non. Enim diam vulputate ut pharetra sit amet aliquam. Convallis convallis tellus id interdum velit laoreet id donec ultrices. Sit amet mattis vulputate enim nulla aliquet porttitor lacus luctus. A lacus vestibulum sed arcu non odio. Ut tortor pretium viverra suspendisse potenti nullam ac tortor. Diam vel quam elementum pulvinar etiam non quam. Viverra justo nec ultrices dui. Eu volutpat odio facilisis mauris sit amet massa. Sed ullamcorper morbi tincidunt ornare massa eget egestas purus. Ac felis donec et odio pellentesque. Nisl vel pretium lectus quam id leo in. Ultricies lacus sed turpis tincidunt id. At urna condimentum mattis pellentesque id nibh tortor id. Sem nulla pharetra diam sit amet nisl suscipit. Neque viverra justo nec ultrices. Arcu cursus euismod quis viverra nibh cras pulvinar. Dolor sit amet consectetur adipiscing elit ut aliquam purus. Id diam vel quam elementum pulvinar etiam non. Elementum pulvinar etiam non quam lacus suspendisse faucibus. Id aliquet lectus proin nibh nisl condimentum id venenatis. Sit amet consectetur adipiscing elit duis tristique sollicitudin nibh. Sed faucibus turpis in eu mi bibendum neque egestas congue. Consectetur libero id faucibus nisl tincidunt eget nullam. At volutpat diam ut venenatis tellus in metus vulputate eu. Condimentum lacinia quis vel eros donec ac odio. Sit amet porttitor eget dolor morbi non arcu risus quis. Viverra mauris in aliquam sem fringilla ut morbi tincidunt. Metus dictum at tempor commodo ullamcorper. At ultrices mi tempus imperdiet nulla. Est ullamcorper eget nulla facilisi etiam dignissim diam quis. Lobortis elementum nibh tellus molestie nunc non. Placerat in egestas erat imperdiet sed. Placerat in egestas erat imperdiet sed euismod. Lobortis feugiat vivamus at augue eget arcu dictum varius. Ut sem nulla pharetra diam sit amet. Et tortor at risus viverra adipiscing at in. Tempor nec feugiat nisl pretium. Cursus euismod quis viverra nibh. Eget mi proin sed libero enim sed. Aliquam id diam maecenas ultricies. Mi tempus imperdiet nulla malesuada pellentesque elit eget. Gravida quis blandit turpis cursus in hac habitasse platea dictumst. Sed tempus urna et pharetra pharetra massa massa. Dolor purus non enim praesent elementum facilisis leo vel. Pharetra vel turpis nunc eget. Quam pellentesque nec nam aliquam sem et tortor consequat id. Orci eu lobortis elementum nibh tellus molestie nunc non. Porttitor leo a diam sollicitudin tempor id. Tincidunt ornare massa eget egestas purus viverra accumsan in nisl. Quam lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Elit ut aliquam purus sit amet luctus venenatis lectus. Velit egestas dui id ornare arcu odio ut sem nulla. Lacus viverra vitae congue eu consequat ac felis donec. Nulla aliquet porttitor lacus luctus accumsan tortor posuere ac ut. Lorem dolor sed viverra ipsum. Blandit libero volutpat sed cras ornare arcu. Egestas erat imperdiet sed euismod nisi porta lorem mollis. Viverra maecenas accumsan lacus vel. Enim neque volutpat ac tincidunt. Porttitor massa id neque aliquam vestibulum morbi blandit cursus risus. Malesuada bibendum arcu vitae elementum curabitur vitae nunc. Et malesuada fames ac turpis egestas integer. Egestas egestas fringilla phasellus faucibus scelerisque eleifend donec pretium. Est placerat in egestas erat imperdiet sed. Non arcu risus quis varius quam quisque. Lorem mollis aliquam ut porttitor leo a. Viverra tellus in hac habitasse platea dictumst vestibulum rhoncus. Fermentum iaculis eu non diam. Erat imperdiet sed euismod nisi porta lorem mollis aliquam. Varius vel pharetra vel turpis nunc eget lorem dolor. Rhoncus mattis rhoncus urna neque viverra. Hac habitasse platea dictumst quisque sagittis purus sit. At quis risus sed vulputate odio ut enim. Pharetra magna ac placerat vestibulum lectus mauris ultrices eros. Rutrum quisque non tellus orci ac auctor. Iaculis eu non diam phasellus vestibulum lorem sed. Ut sem nulla pharetra diam sit amet nisl suscipit. Risus at ultrices mi tempus. Vitae tortor condimentum lacinia quis vel eros donec. Sed tempus urna et pharetra. Posuere sollicitudin aliquam ultrices sagittis orci. Congue quisque egestas diam in arcu. Hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Pellentesque habitant morbi tristique senectus et netus et. Id interdum velit laoreet id. Fusce ut placerat orci nulla pellentesque dignissim. Pretium nibh ipsum consequat nisl vel pretium. Etiam erat velit scelerisque in dictum non consectetur a. Turpis in eu mi bibendum neque egestas congue quisque egestas. Pulvinar sapien et ligula ullamcorper malesuada. Ultricies tristique nulla aliquet enim tortor at. Suspendisse interdum consectetur libero id faucibus. Lorem sed risus ultricies tristique nulla aliquet. Tristique senectus et netus et malesuada fames. Eu augue ut lectus arcu bibendum at varius vel. Egestas sed tempus urna et pharetra pharetra massa massa ultricies. Aliquet eget sit amet tellus cras adipiscing. Massa placerat duis ultricies lacus sed turpis tincidunt id aliquet. Ornare massa eget egestas purus viverra accumsan in nisl. Justo laoreet sit amet cursus sit amet. In metus vulputate eu scelerisque felis imperdiet proin. At erat pellentesque adipiscing commodo elit at. Ipsum suspendisse ultrices gravida dictum fusce. Lectus sit amet est placerat in egestas erat. Aliquam ultrices sagittis orci a. Sagittis id consectetur purus ut faucibus pulvinar elementum. Ornare arcu odio ut sem nulla pharetra diam. Sit amet purus gravida quis blandit turpis cursus. Duis ultricies lacus sed turpis tincidunt. Malesuada fames ac turpis egestas sed tempus urna et. Viverra ipsum nunc aliquet bibendum enim facilisis. Et pharetra pharetra massa massa ultricies mi quis. Eget duis at tellus at urna condimentum mattis. Euismod in pellentesque massa placerat. Enim nunc faucibus a pellentesque sit amet porttitor. Dolor sed viverra ipsum nunc aliquet. Donec enim diam vulputate ut pharetra sit amet. Feugiat sed lectus vestibulum mattis ullamcorper velit sed. Erat pellentesque adipiscing commodo elit at imperdiet. Nisl purus in mollis nunc sed id semper risus. Tincidunt augue interdum velit euismod in pellentesque massa. Facilisis magna etiam tempor orci. Mauris in aliquam sem fringilla ut. Gravida dictum fusce ut placerat orci. Sed risus ultricies tristique nulla. Odio morbi quis commodo odio. Feugiat in ante metus dictum at tempor commodo ullamcorper. Porta non pulvinar neque laoreet suspendisse interdum. Etiam tempor orci eu lobortis elementum. Fusce ut placerat orci nulla pellentesque dignissim. Ornare lectus sit amet est placerat in egestas erat. Quis vel eros donec ac. Elementum pulvinar etiam non quam lacus. Sit amet tellus cras adipiscing enim eu turpis. Amet tellus cras adipiscing enim eu. Sed faucibus turpis in eu mi bibendum. Lectus proin nibh nisl condimentum id. Sollicitudin nibh sit amet commodo nulla. Sed tempus urna et pharetra pharetra massa massa. Magna eget est lorem ipsum. Elit ullamcorper dignissim cras tincidunt lobortis feugiat vivamus at. Fermentum dui faucibus in ornare quam viverra orci sagittis eu. Dignissim convallis aenean et tortor. Ut faucibus pulvinar elementum integer enim neque. Nibh cras pulvinar mattis nunc sed. Pellentesque sit amet porttitor eget dolor morbi. Mi eget mauris pharetra et ultrices neque ornare aenean euismod. Quis risus sed vulputate odio ut enim blandit volutpat. Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. In vitae turpis massa sed elementum tempus egestas sed sed. Urna id volutpat lacus laoreet non. Egestas pretium aenean pharetra magna ac placerat. Amet commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Donec et odio pellentesque diam volutpat commodo sed. Etiam non quam lacus suspendisse. Augue neque gravida in fermentum et sollicitudin ac orci. Eu feugiat pretium nibh ipsum. Nam at lectus urna duis convallis convallis tellus id. Egestas integer eget aliquet nibh. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae auctor. Urna condimentum mattis pellentesque id nibh tortor id. In egestas erat imperdiet sed euismod. Ut sem viverra aliquet eget sit amet tellus. Feugiat pretium nibh ipsum consequat nisl vel pretium. Volutpat odio facilisis mauris sit amet. Mi sit amet mauris commodo quis imperdiet massa tincidunt. Neque volutpat ac tincidunt vitae semper quis lectus nulla at. Nec feugiat in fermentum posuere urna nec. Ut venenatis tellus in metus vulputate eu. Vestibulum rhoncus est pellentesque elit ullamcorper dignissim. Eu scelerisque felis imperdiet proin. Vitae et leo duis ut diam quam nulla. Ut venenatis tellus in metus vulputate eu scelerisque. Tincidunt dui ut ornare lectus sit amet. Adipiscing diam donec adipiscing tristique risus. Turpis nunc eget lorem dolor sed viverra ipsum nunc aliquet. Non sodales neque sodales ut. Massa placerat duis ultricies lacus sed turpis tincidunt. Viverra orci sagittis eu volutpat odio facilisis mauris sit amet. Adipiscing vitae proin sagittis nisl. Vitae aliquet nec ullamcorper sit. Potenti nullam ac tortor vitae purus. Ultricies lacus sed turpis tincidunt id. Ut diam quam nulla porttitor massa id neque aliquam vestibulum. Semper eget duis at tellus at urna condimentum mattis pellentesque. Nec tincidunt praesent semper feugiat nibh sed pulvinar proin. Dictum fusce ut placerat orci nulla pellentesque dignissim. Amet luctus venenatis lectus magna fringilla urna. Quam quisque id diam vel quam elementum pulvinar. At tempor commodo ullamcorper a. Magna etiam tempor orci eu lobortis. Suspendisse ultrices gravida dictum fusce. Massa ultricies mi quis hendrerit dolor magna. Massa tincidunt nunc pulvinar sapien et ligula ullamcorper malesuada proin. Aliquet enim tortor at auctor urna nunc id. Semper feugiat nibh sed pulvinar proin gravida. Porttitor rhoncus dolor purus non enim. Metus aliquam eleifend mi in nulla. Lectus arcu bibendum at varius vel pharetra. Sed vulputate odio ut enim blandit volutpat. Et ligula ullamcorper malesuada proin libero nunc consequat interdum varius. Donec et odio pellentesque diam volutpat commodo. Id ornare arcu odio ut sem nulla pharetra diam sit. Est ullamcorper eget nulla facilisi etiam dignissim diam quis enim. Sagittis vitae et leo duis ut diam quam nulla. Elementum nisi quis eleifend quam. Congue mauris rhoncus aenean vel elit. Adipiscing elit duis tristique sollicitudin nibh sit. Egestas egestas fringilla phasellus faucibus scelerisque. Morbi tincidunt augue interdum velit euismod. Massa sed elementum tempus egestas sed sed. Id leo in vitae turpis massa sed elementum tempus egestas. In pellentesque massa placerat duis ultricies lacus sed turpis. Vitae proin sagittis nisl rhoncus mattis rhoncus. Enim tortor at auctor urna nunc id. In fermentum posuere urna nec tincidunt praesent semper feugiat nibh. Aliquam ut porttitor leo a diam sollicitudin tempor id. Pellentesque elit eget gravida cum sociis natoque. Molestie at elementum eu facilisis sed odio morbi quis. Tristique senectus et netus et malesuada fames ac turpis. Proin libero nunc consequat interdum varius sit amet mattis. Pellentesque id nibh tortor id. Risus sed vulputate odio ut enim blandit. Laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt eget. Morbi tincidunt augue interdum velit euismod in pellentesque. Pharetra pharetra massa massa ultricies mi quis hendrerit. Nunc aliquet bibendum enim facilisis gravida neque. Feugiat sed lectus vestibulum mattis ullamcorper velit sed ullamcorper. Risus quis varius quam quisque id diam vel. Et ultrices neque ornare aenean. Aliquet sagittis id consectetur purus ut faucibus pulvinar elementum. Nibh ipsum consequat nisl vel. Mauris rhoncus aenean vel elit scelerisque mauris pellentesque pulvinar. Ornare quam viverra orci sagittis eu volutpat odio facilisis. Euismod nisi porta lorem mollis aliquam. Enim ut tellus elementum sagittis. Rhoncus mattis rhoncus urna neque. Malesuada fames ac turpis egestas. Cursus in hac habitasse platea dictumst quisque sagittis. Sit amet aliquam id diam maecenas ultricies mi eget mauris. Enim sit amet venenatis urna cursus eget nunc. Fermentum odio eu feugiat pretium nibh ipsum consequat. Eu scelerisque felis imperdiet proin. Nullam non nisi est sit amet facilisis magna etiam tempor. In mollis nunc sed id semper risus in hendrerit. Sollicitudin nibh sit amet commodo nulla facilisi nullam. Sit amet nisl purus in mollis nunc sed id. Nam libero justo laoreet sit amet cursus sit amet dictum. Condimentum id venenatis a condimentum vitae sapien pellentesque. Porta nibh venenatis cras sed felis. Lectus nulla at volutpat diam ut venenatis tellus in. Aliquam etiam erat velit scelerisque in dictum non consectetur a. Leo vel fringilla est ullamcorper eget. Sodales ut etiam sit amet nisl purus in mollis nunc. Euismod nisi porta lorem mollis aliquam. Ornare arcu odio ut sem nulla. Sed felis eget velit aliquet sagittis id consectetur. Pellentesque nec nam aliquam sem et tortor consequat id. Enim nec dui nunc mattis enim ut tellus elementum. Nullam non nisi est sit amet facilisis magna. Rutrum quisque non tellus orci ac auctor augue. Nunc vel risus commodo viverra maecenas accumsan lacus. Viverra vitae congue eu consequat. Sollicitudin nibh sit amet commodo nulla. Amet volutpat consequat mauris nunc congue nisi. Maecenas pharetra convallis posuere morbi leo urna molestie at. Mattis vulputate enim nulla aliquet porttitor lacus luctus accumsan tortor. Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc consequat. Adipiscing diam donec adipiscing tristique risus. Elementum curabitur vitae nunc sed velit dignissim sodales ut. Eleifend donec pretium vulputate sapien nec. Commodo quis imperdiet massa tincidunt nunc pulvinar. Proin libero nunc consequat interdum varius sit amet mattis. Facilisis gravida neque convallis a cras semper auctor neque vitae. Quisque egestas diam in arcu cursus. Nunc eget lorem dolor sed viverra ipsum. Mauris sit amet massa vitae tortor condimentum lacinia quis vel. Aliquam sem et tortor consequat id porta nibh venenatis cras. Nunc sed id semper risus in. Enim sed faucibus turpis in eu mi bibendum neque. Molestie nunc non blandit massa enim. Enim praesent elementum facilisis leo vel fringilla est ullamcorper. Semper risus in hendrerit gravida rutrum quisque non tellus orci. Ac turpis egestas maecenas pharetra. In nulla posuere sollicitudin aliquam. Justo nec ultrices dui sapien eget mi proin sed libero. In ornare quam viverra orci sagittis eu. Proin nibh nisl condimentum id venenatis. Morbi enim nunc faucibus a pellentesque sit amet porttitor eget. Quis risus sed vulputate odio ut enim blandit. Risus feugiat in ante metus dictum at tempor commodo. Sodales neque sodales ut etiam. Nunc id cursus metus aliquam. Gravida dictum fusce ut placerat orci nulla pellentesque dignissim enim. Augue ut lectus arcu bibendum at. Quis varius quam quisque id diam vel quam. Egestas congue quisque egestas diam in arcu. Condimentum mattis pellentesque id nibh tortor id aliquet lectus. Enim lobortis scelerisque fermentum dui faucibus in. In tellus integer feugiat scelerisque varius morbi enim nunc. Mattis molestie a iaculis at erat pellentesque. Elit scelerisque mauris pellentesque pulvinar pellentesque habitant morbi tristique. Lorem ipsum dolor sit amet consectetur adipiscing elit ut aliquam. Nisl rhoncus mattis rhoncus urna neque. Ac auctor augue mauris augue neque gravida in fermentum et. Sodales ut eu sem integer vitae justo eget. Sed egestas egestas fringilla phasellus. Viverra adipiscing at in tellus integer feugiat scelerisque varius. Purus gravida quis blandit turpis. Id porta nibh venenatis cras sed. Mattis vulputate enim nulla aliquet porttitor lacus. Augue eget arcu dictum varius duis at consectetur lorem donec. Nulla at volutpat diam ut venenatis tellus in metus. Aliquam etiam erat velit scelerisque in dictum non consectetur. Turpis cursus in hac habitasse platea dictumst. Consequat mauris nunc congue nisi vitae suscipit tellus. Volutpat maecenas volutpat blandit aliquam etiam. Massa massa ultricies mi quis hendrerit dolor magna eget est. Velit egestas dui id ornare arcu. Non consectetur a erat nam at. Orci sagittis eu volutpat odio facilisis mauris sit amet. Dui id ornare arcu odio. Sed arcu non odio euismod lacinia. Feugiat in ante metus dictum. Gravida arcu ac tortor dignissim convallis. Egestas sed tempus urna et pharetra pharetra massa massa. Nulla facilisi nullam vehicula ipsum a arcu. Ipsum a arcu cursus vitae congue mauris. Porttitor rhoncus dolor purus non. Magna sit amet purus gravida quis blandit. Sapien eget mi proin sed libero enim sed faucibus turpis. Nisl nunc mi ipsum faucibus vitae aliquet nec ullamcorper sit. Pellentesque dignissim enim sit amet venenatis urna cursus eget. Pharetra massa massa ultricies mi quis hendrerit. Sapien nec sagittis aliquam malesuada bibendum. Nunc scelerisque viverra mauris in aliquam sem fringilla ut. Dolor magna eget est lorem ipsum dolor. Amet commodo nulla facilisi nullam. Pellentesque elit ullamcorper dignissim cras. Id porta nibh venenatis cras sed felis eget. Nam at lectus urna duis. Laoreet non curabitur gravida arcu ac tortor dignissim convallis. Nunc lobortis mattis aliquam faucibus purus in massa tempor. Sit amet luctus venenatis lectus magna fringilla. Duis ultricies lacus sed turpis tincidunt id. Sed velit dignissim sodales ut eu. Ut tortor pretium viverra suspendisse potenti nullam. Iaculis at erat pellentesque adipiscing. Ipsum nunc aliquet bibendum enim facilisis gravida neque. Nulla aliquet enim tortor at auctor urna nunc id cursus. Amet cursus sit amet dictum sit amet justo donec enim. Enim nunc faucibus a pellentesque sit amet porttitor eget dolor. Pharetra magna ac placerat vestibulum lectus mauris ultrices eros in. Nulla facilisi etiam dignissim diam quis enim. Ut enim blandit volutpat maecenas volutpat blandit aliquam etiam erat. Imperdiet proin fermentum leo vel orci porta non pulvinar neque. Vel fringilla est ullamcorper eget nulla. Bibendum neque egestas congue quisque egestas diam in arcu cursus. Ipsum nunc aliquet bibendum enim facilisis gravida neque convallis a. Arcu cursus vitae congue mauris rhoncus aenean vel elit. Augue eget arcu dictum varius duis. Tristique et egestas quis ipsum. Quis varius quam quisque id. Varius sit amet mattis vulputate. Mattis molestie a iaculis at erat pellentesque. Libero justo laoreet sit amet cursus. Aliquam id diam maecenas ultricies mi eget mauris pharetra. Ut eu sem integer vitae justo eget. Fames ac turpis egestas sed. Suspendisse in est ante in nibh mauris cursus mattis. Faucibus pulvinar elementum integer enim neque volutpat ac tincidunt vitae. Neque vitae tempus quam pellentesque nec nam aliquam. Lobortis elementum nibh tellus molestie nunc non. Lacus vel facilisis volutpat est velit egestas dui. Justo laoreet sit amet cursus sit amet dictum sit amet. Adipiscing enim eu turpis egestas pretium aenean pharetra magna. Cursus metus aliquam eleifend mi in nulla posuere. Nibh mauris cursus mattis molestie a. Dignissim diam quis enim lobortis scelerisque fermentum. A scelerisque purus semper eget duis at tellus. Lacus sed turpis tincidunt id aliquet risus feugiat in. Non tellus orci ac auctor. Ultrices in iaculis nunc sed augue lacus. Tincidunt tortor aliquam nulla facilisi cras. Nulla facilisi nullam vehicula ipsum a arcu cursus vitae congue. Eget magna fermentum iaculis eu non diam phasellus. Pharetra massa massa ultricies mi quis. Eget mauris pharetra et ultrices neque ornare. Aliquam faucibus purus in massa. Facilisi morbi tempus iaculis urna id volutpat lacus. Accumsan lacus vel facilisis volutpat. Curabitur gravida arcu ac tortor. Quam lacus suspendisse faucibus interdum. Elementum nibh tellus molestie nunc non blandit massa enim. Libero id faucibus nisl tincidunt. Bibendum ut tristique et egestas. Ut diam quam nulla porttitor massa id neque aliquam vestibulum. Augue interdum velit euismod in pellentesque. Adipiscing diam donec adipiscing tristique risus nec feugiat. Fringilla ut morbi tincidunt augue interdum velit. Vitae et leo duis ut diam quam nulla porttitor massa. Egestas integer eget aliquet nibh praesent tristique. Posuere sollicitudin aliquam ultrices sagittis orci a. Nisi est sit amet facilisis. Risus quis varius quam quisque id diam. Faucibus turpis in eu mi. Et molestie ac feugiat sed lectus vestibulum. Porttitor lacus luctus accumsan tortor posuere ac. Platea dictumst vestibulum rhoncus est pellentesque. Tortor pretium viverra suspendisse potenti nullam ac tortor. Enim praesent elementum facilisis leo vel fringilla est. Proin libero nunc consequat interdum varius sit amet mattis vulputate. Turpis egestas pretium aenean pharetra magna ac placerat vestibulum lectus. Nulla pharetra diam sit amet nisl suscipit. Mauris nunc congue nisi vitae suscipit tellus mauris a diam. Faucibus in ornare quam viverra orci sagittis eu volutpat. Volutpat consequat mauris nunc congue nisi vitae. Dui nunc mattis enim ut tellus. Adipiscing elit ut aliquam purus sit amet luctus. Tempus egestas sed sed risus. Scelerisque fermentum dui faucibus in ornare quam viverra orci. Massa ultricies mi quis hendrerit dolor magna eget. Pulvinar mattis nunc sed blandit libero volutpat sed cras ornare. Ut eu sem integer vitae justo eget magna fermentum. Ornare quam viverra orci sagittis. Eget dolor morbi non arcu risus quis varius quam. Tincidunt praesent semper feugiat nibh sed pulvinar. Sit amet justo donec enim diam vulputate. Dui faucibus in ornare quam viverra. Tincidunt tortor aliquam nulla facilisi cras fermentum odio eu. Turpis egestas sed tempus urna et. Pretium quam vulputate dignissim suspendisse in est ante in. Morbi quis commodo odio aenean sed adipiscing diam donec. Nunc mattis enim ut tellus elementum sagittis vitae et. Diam vel quam elementum pulvinar etiam non quam. Convallis posuere morbi leo urna molestie at elementum eu. Adipiscing at in tellus integer feugiat scelerisque varius morbi. Quis varius quam quisque id diam vel quam elementum. Dui accumsan sit amet nulla. Adipiscing elit duis tristique sollicitudin nibh sit amet commodo. Viverra ipsum nunc aliquet bibendum enim facilisis. Porta lorem mollis aliquam ut. Velit ut tortor pretium viverra suspendisse potenti. Quis viverra nibh cras pulvinar mattis nunc sed blandit. Pharetra magna ac placerat vestibulum. Mauris ultrices eros in cursus turpis massa. Lacus vestibulum sed arcu non odio euismod lacinia at. Dapibus ultrices in iaculis nunc sed. Cras adipiscing enim eu turpis egestas. Eget arcu dictum varius duis at consectetur. Consequat id porta nibh venenatis cras sed felis eget velit. Integer enim neque volutpat ac tincidunt vitae. Feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Ut morbi tincidunt augue interdum velit euismod. Sed cras ornare arcu dui vivamus arcu felis bibendum ut. Eget felis eget nunc lobortis mattis aliquam faucibus purus in. Luctus venenatis lectus magna fringilla urna porttitor rhoncus dolor. Nisl nunc mi ipsum faucibus vitae. Proin fermentum leo vel orci porta. Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Et leo duis ut diam quam. Eros in cursus turpis massa tincidunt. Volutpat est velit egestas dui id. Commodo odio aenean sed adipiscing diam. Quis blandit turpis cursus in hac habitasse platea dictumst quisque. Magna fringilla urna porttitor rhoncus dolor. Amet consectetur adipiscing elit ut aliquam purus sit amet. Vitae justo eget magna fermentum iaculis eu non diam. Hendrerit dolor magna eget est. Ac placerat vestibulum lectus mauris ultrices eros in cursus turpis. Egestas diam in arcu cursus. At varius vel pharetra vel turpis nunc. Lacus vel facilisis volutpat est velit. Ut ornare lectus sit amet est placerat in egestas. Quam adipiscing vitae proin sagittis nisl rhoncus. Dolor purus non enim praesent. Urna condimentum mattis pellentesque id. Magnis dis parturient montes nascetur ridiculus. Feugiat nisl pretium fusce id. Sed cras ornare arcu dui vivamus. Vitae turpis massa sed elementum tempus egestas sed sed. Ac feugiat sed lectus vestibulum mattis ullamcorper velit sed ullamcorper. Ac ut consequat semper viverra nam libero. Consectetur lorem donec massa sapien faucibus. Purus viverra accumsan in nisl nisi scelerisque eu ultrices. Eu turpis egestas pretium aenean pharetra. Nisl rhoncus mattis rhoncus urna neque viverra justo nec ultrices. Pellentesque sit amet porttitor eget dolor morbi non arcu. Vitae justo eget magna fermentum iaculis. Quis auctor elit sed vulputate mi sit. Purus viverra accumsan in nisl nisi scelerisque eu ultrices. Semper auctor neque vitae tempus quam pellentesque nec nam. Rhoncus dolor purus non enim. Sed turpis tincidunt id aliquet risus feugiat. Sit amet justo donec enim diam vulputate ut pharetra sit. Risus pretium quam vulputate dignissim suspendisse in est ante in. Massa sapien faucibus et molestie ac feugiat. Id aliquet risus feugiat in ante metus. Risus ultricies tristique nulla aliquet enim tortor at auctor urna. Sed lectus vestibulum mattis ullamcorper velit sed ullamcorper morbi. Lacus sed turpis tincidunt id aliquet risus feugiat in. Risus ultricies tristique nulla aliquet enim tortor. In ornare quam viverra orci sagittis eu volutpat. Netus et malesuada fames ac turpis egestas sed tempus urna. Fames ac turpis egestas maecenas pharetra convallis posuere morbi. Etiam erat velit scelerisque in dictum non. Cursus turpis massa tincidunt dui ut ornare lectus. Tristique sollicitudin nibh sit amet commodo nulla facilisi. Pellentesque pulvinar pellentesque habitant morbi tristique senectus et. Aliquet eget sit amet tellus cras. Nullam ac tortor vitae purus faucibus ornare. Lacus viverra vitae congue eu consequat. Vulputate ut pharetra sit amet. Est ante in nibh mauris cursus mattis molestie a. Ipsum suspendisse ultrices gravida dictum fusce ut placerat orci. Et tortor at risus viverra. Sed libero enim sed faucibus turpis in eu. Id cursus metus aliquam eleifend mi in nulla posuere sollicitudin. Risus viverra adipiscing at in. Imperdiet massa tincidunt nunc pulvinar sapien et. Nec feugiat in fermentum posuere urna nec tincidunt. Ultricies mi eget mauris pharetra et. Morbi tristique senectus et netus et malesuada fames ac. At quis risus sed vulputate. Interdum velit laoreet id donec. Sapien pellentesque habitant morbi tristique. Pharetra vel turpis nunc eget lorem dolor sed viverra. In massa tempor nec feugiat nisl. Massa tincidunt nunc pulvinar sapien et ligula ullamcorper malesuada proin. Mauris augue neque gravida in. Faucibus vitae aliquet nec ullamcorper sit amet risus. Id velit ut tortor pretium viverra suspendisse potenti. Leo integer malesuada nunc vel risus commodo viverra maecenas. Risus quis varius quam quisque id. Aliquam malesuada bibendum arcu vitae elementum curabitur vitae. Vestibulum lectus mauris ultrices eros in cursus turpis. Fermentum posuere urna nec tincidunt. Magna etiam tempor orci eu lobortis elementum nibh tellus molestie. Id ornare arcu odio ut. Facilisi nullam vehicula ipsum a arcu cursus vitae congue. Nulla pellentesque dignissim enim sit amet venenatis urna cursus eget. Viverra mauris in aliquam sem fringilla ut morbi tincidunt. Quis ipsum suspendisse ultrices gravida dictum fusce ut placerat orci. Sed cras ornare arcu dui vivamus arcu felis. Egestas diam in arcu cursus euismod quis. Tincidunt dui ut ornare lectus. Morbi tristique senectus et netus et. Ornare arcu dui vivamus arcu felis bibendum ut tristique. Habitant morbi tristique senectus et netus et malesuada fames ac. Ut tristique et egestas quis. Mollis aliquam ut porttitor leo. Venenatis tellus in metus vulputate eu scelerisque felis imperdiet proin. Sagittis eu volutpat odio facilisis mauris sit amet massa. Eu facilisis sed odio morbi. Nunc consequat interdum varius sit amet mattis. Velit dignissim sodales ut eu. Pellentesque eu tincidunt tortor aliquam. Porta lorem mollis aliquam ut porttitor. Rhoncus urna neque viverra justo nec ultrices. Viverra suspendisse potenti nullam ac tortor vitae purus. Fermentum posuere urna nec tincidunt praesent semper feugiat nibh sed. Purus sit amet luctus venenatis lectus magna fringilla urna porttitor. Sed lectus vestibulum mattis ullamcorper velit sed ullamcorper. Nulla posuere sollicitudin aliquam ultrices sagittis orci a scelerisque. Nisl nisi scelerisque eu ultrices vitae auctor. In vitae turpis massa sed elementum tempus egestas. Cursus sit amet dictum sit amet justo donec enim. Vitae congue eu consequat ac felis donec et. Augue interdum velit euismod in pellentesque massa placerat. Enim ut sem viverra aliquet eget sit amet. Velit scelerisque in dictum non consectetur a erat. Sed lectus vestibulum mattis ullamcorper velit sed ullamcorper. Nunc faucibus a pellentesque sit amet porttitor eget. Tellus integer feugiat scelerisque varius morbi. Lorem sed risus ultricies tristique nulla aliquet enim tortor at. Eget nulla facilisi etiam dignissim diam quis enim lobortis scelerisque. Adipiscing elit duis tristique sollicitudin. Adipiscing elit pellentesque habitant morbi tristique. Ac tincidunt vitae semper quis lectus nulla at. Maecenas sed enim ut sem viverra. Erat pellentesque adipiscing commodo elit at imperdiet. Dolor morbi non arcu risus quis varius quam quisque. Fringilla urna porttitor rhoncus dolor purus non enim praesent. Tellus integer feugiat scelerisque varius morbi enim nunc faucibus a. Felis eget nunc lobortis mattis aliquam faucibus purus in. Fringilla phasellus faucibus scelerisque eleifend. Pulvinar etiam non quam lacus suspendisse faucibus interdum posuere. Risus ultricies tristique nulla aliquet. Lectus sit amet est placerat. Ac ut consequat semper viverra nam libero justo. Dapibus ultrices in iaculis nunc sed augue. Mattis ullamcorper velit sed ullamcorper. Eget nullam non nisi est. Vitae elementum curabitur vitae nunc sed velit. Sit amet commodo nulla facilisi nullam vehicula ipsum a arcu. Tempor nec feugiat nisl pretium fusce id velit ut. Nulla pellentesque dignissim enim sit amet venenatis. Sed tempus urna et pharetra pharetra. Congue quisque egestas diam in. Convallis posuere morbi leo urna. Nec tincidunt praesent semper feugiat nibh sed pulvinar proin gravida. Sagittis nisl rhoncus mattis rhoncus urna neque viverra justo. Scelerisque felis imperdiet proin fermentum leo vel. Ut placerat orci nulla pellentesque dignissim enim sit amet. In cursus turpis massa tincidunt dui. Rutrum quisque non tellus orci ac auctor augue mauris augue. Cursus vitae congue mauris rhoncus aenean vel elit scelerisque mauris. Scelerisque fermentum dui faucibus in ornare quam viverra orci. Habitant morbi tristique senectus et netus et. Ridiculus mus mauris vitae ultricies leo. Vitae semper quis lectus nulla at volutpat diam. Purus faucibus ornare suspendisse sed nisi. Enim lobortis scelerisque fermentum dui faucibus in ornare quam. Mi tempus imperdiet nulla malesuada pellentesque elit eget. Varius duis at consectetur lorem donec. Pulvinar pellentesque habitant morbi tristique senectus et netus et. A iaculis at erat pellentesque adipiscing commodo elit at imperdiet. Mi ipsum faucibus vitae aliquet nec. Libero volutpat sed cras ornare arcu dui vivamus arcu. Natoque penatibus et magnis dis parturient montes nascetur ridiculus. Maecenas volutpat blandit aliquam etiam erat velit scelerisque. Cras adipiscing enim eu turpis. Nec tincidunt praesent semper feugiat nibh sed pulvinar. Justo laoreet sit amet cursus sit amet dictum sit. Velit scelerisque in dictum non consectetur a erat nam. Turpis tincidunt id aliquet risus feugiat in ante. Aliquet risus feugiat in ante metus dictum. Hac habitasse platea dictumst quisque sagittis purus sit. Et pharetra pharetra massa massa ultricies. Sit amet nisl suscipit adipiscing bibendum est ultricies integer. Venenatis urna cursus eget nunc scelerisque viverra mauris in. Integer quis auctor elit sed. In est ante in nibh mauris cursus mattis molestie. Scelerisque in dictum non consectetur a erat nam at. Lectus sit amet est placerat in. Sit amet cursus sit amet. Nibh nisl condimentum id venenatis a condimentum. Purus ut faucibus pulvinar elementum integer enim. Pharetra sit amet aliquam id diam maecenas. Id cursus metus aliquam eleifend mi in nulla posuere. Lobortis mattis aliquam faucibus purus in massa tempor nec. Urna neque viverra justo nec ultrices dui sapien eget. Enim ut sem viverra aliquet eget sit amet. In eu mi bibendum neque egestas congue quisque egestas. Enim neque volutpat ac tincidunt. Orci ac auctor augue mauris augue neque gravida in fermentum. Velit aliquet sagittis id consectetur. Enim ut sem viverra aliquet eget sit amet tellus. Semper auctor neque vitae tempus quam pellentesque nec. Non blandit massa enim nec dui nunc. Morbi blandit cursus risus at ultrices mi tempus imperdiet nulla. Arcu non odio euismod lacinia at quis risus. Dictum varius duis at consectetur lorem donec massa. Blandit massa enim nec dui. Nibh ipsum consequat nisl vel. Turpis in eu mi bibendum neque. Ut tristique et egestas quis. Ac odio tempor orci dapibus. Gravida dictum fusce ut placerat orci nulla pellentesque dignissim. Integer feugiat scelerisque varius morbi enim. Libero volutpat sed cras ornare arcu dui. Odio aenean sed adipiscing diam. Et egestas quis ipsum suspendisse ultrices. Aliquet lectus proin nibh nisl condimentum. Sit amet consectetur adipiscing elit duis tristique sollicitudin nibh sit. Blandit massa enim nec dui. Tellus molestie nunc non blandit massa enim nec. Tortor vitae purus faucibus ornare suspendisse sed nisi. Nascetur ridiculus mus mauris vitae ultricies leo. Elementum facilisis leo vel fringilla est ullamcorper eget nulla. Diam maecenas ultricies mi eget. Duis tristique sollicitudin nibh sit amet commodo nulla. Tempus iaculis urna id volutpat lacus laoreet non curabitur gravida. Dictumst quisque sagittis purus sit amet. Viverra mauris in aliquam sem. Quis risus sed vulputate odio ut enim blandit volutpat maecenas. Condimentum mattis pellentesque id nibh tortor id. Non sodales neque sodales ut etiam sit amet. Ipsum consequat nisl vel pretium. Cursus in hac habitasse platea dictumst quisque sagittis purus sit. Fringilla est ullamcorper eget nulla facilisi etiam. Tellus elementum sagittis vitae et leo duis ut diam quam. Nisl vel pretium lectus quam id leo in."}}
diff --git a/tests/data/valid/toml-lang-compliance/valid/qa/qa-scalar-literal-40kb.toml b/tests/data/valid/toml-lang-compliance/valid/qa/qa-scalar-literal-40kb.toml
new file mode 100644
index 0000000..25a87ac
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/qa/qa-scalar-literal-40kb.toml
@@ -0,0 +1 @@
+long = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Quam lacus suspendisse faucibus interdum posuere lorem ipsum dolor. Amet consectetur adipiscing elit ut. Nulla facilisi etiam dignissim diam quis enim lobortis. Curabitur vitae nunc sed velit dignissim sodales ut eu. Fames ac turpis egestas sed tempus urna et. Facilisi cras fermentum odio eu feugiat pretium. Nec tincidunt praesent semper feugiat nibh sed pulvinar proin gravida. Est lorem ipsum dolor sit amet consectetur adipiscing elit. Vel quam elementum pulvinar etiam non quam lacus. Pharetra et ultrices neque ornare aenean euismod. Nisl nisi scelerisque eu ultrices. Eget dolor morbi non arcu risus. Bibendum neque egestas congue quisque egestas diam in arcu cursus. Faucibus nisl tincidunt eget nullam. Nisl pretium fusce id velit ut tortor pretium viverra suspendisse. Mauris ultrices eros in cursus. Donec ac odio tempor orci dapibus ultrices in iaculis. Tellus cras adipiscing enim eu turpis egestas pretium aenean pharetra. Eros in cursus turpis massa. Nascetur ridiculus mus mauris vitae ultricies leo integer malesuada nunc. Velit sed ullamcorper morbi tincidunt ornare massa eget egestas purus. Aenean euismod elementum nisi quis eleifend quam. Magnis dis parturient montes nascetur ridiculus mus. Eu tincidunt tortor aliquam nulla facilisi cras. Tristique senectus et netus et malesuada fames. Urna nec tincidunt praesent semper feugiat nibh sed pulvinar. Vitae ultricies leo integer malesuada nunc vel risus commodo viverra. Ac turpis egestas sed tempus urna et. Amet mauris commodo quis imperdiet massa tincidunt. Urna nunc id cursus metus aliquam eleifend mi. In nulla posuere sollicitudin aliquam ultrices sagittis orci a scelerisque. Neque aliquam vestibulum morbi blandit cursus. Pulvinar mattis nunc sed blandit libero volutpat sed. Sed egestas egestas fringilla phasellus faucibus scelerisque eleifend donec pretium. Blandit cursus risus at ultrices mi tempus. Turpis massa sed elementum tempus egestas sed sed. Dictum varius duis at consectetur lorem. Commodo ullamcorper a lacus vestibulum sed arcu non. Dolor magna eget est lorem. Tincidunt arcu non sodales neque sodales ut etiam sit amet. Sit amet risus nullam eget felis eget nunc lobortis. Risus in hendrerit gravida rutrum quisque non tellus orci. Elementum pulvinar etiam non quam lacus suspendisse faucibus. Morbi tristique senectus et netus et malesuada. In aliquam sem fringilla ut morbi tincidunt. Ornare aenean euismod elementum nisi quis eleifend quam. Sed id semper risus in hendrerit gravida rutrum quisque. Lorem ipsum dolor sit amet consectetur adipiscing elit. A condimentum vitae sapien pellentesque habitant morbi tristique senectus et. Faucibus purus in massa tempor nec feugiat nisl. Vehicula ipsum a arcu cursus vitae congue. Facilisi cras fermentum odio eu feugiat pretium nibh. Viverra mauris in aliquam sem fringilla ut morbi tincidunt. Ultrices dui sapien eget mi proin sed libero enim. Nisi est sit amet facilisis magna etiam tempor. Posuere ac ut consequat semper viverra nam. Dis parturient montes nascetur ridiculus mus mauris vitae. Nec sagittis aliquam malesuada bibendum. Mattis pellentesque id nibh tortor id aliquet lectus. Vitae congue eu consequat ac felis donec et. Cras sed felis eget velit aliquet sagittis id consectetur purus. Pellentesque elit ullamcorper dignissim cras tincidunt. Pellentesque dignissim enim sit amet venenatis urna. A cras semper auctor neque vitae tempus. Amet massa vitae tortor condimentum lacinia quis vel eros donec. Tempor commodo ullamcorper a lacus. Nibh tellus molestie nunc non blandit massa enim nec dui. Viverra orci sagittis eu volutpat odio facilisis mauris sit. Sed augue lacus viverra vitae. Vulputate eu scelerisque felis imperdiet proin fermentum leo vel orci. Tellus rutrum tellus pellentesque eu tincidunt tortor. Cras semper auctor neque vitae tempus quam pellentesque nec. Lorem ipsum dolor sit amet consectetur adipiscing elit ut aliquam. Tristique magna sit amet purus gravida quis blandit turpis. Viverra ipsum nunc aliquet bibendum. Arcu bibendum at varius vel. Amet mattis vulputate enim nulla. Vulputate enim nulla aliquet porttitor. Volutpat blandit aliquam etiam erat velit scelerisque in dictum. Morbi tristique senectus et netus et malesuada fames ac. Faucibus et molestie ac feugiat sed. Tellus elementum sagittis vitae et leo duis. Id aliquet lectus proin nibh. Ornare arcu dui vivamus arcu. Morbi tincidunt augue interdum velit euismod in pellentesque massa placerat. Quis eleifend quam adipiscing vitae. Tristique senectus et netus et malesuada fames ac turpis. Pharetra convallis posuere morbi leo. Ornare arcu odio ut sem nulla pharetra diam sit. Morbi tristique senectus et netus et. Dictum non consectetur a erat nam at lectus urna. Varius vel pharetra vel turpis. Mi ipsum faucibus vitae aliquet. Tellus in metus vulputate eu scelerisque felis imperdiet proin. In est ante in nibh mauris cursus mattis. Massa ultricies mi quis hendrerit dolor magna eget. Fermentum leo vel orci porta. Elit ut aliquam purus sit amet luctus venenatis lectus. Eget aliquet nibh praesent tristique magna sit amet. Arcu non odio euismod lacinia at quis. Montes nascetur ridiculus mus mauris vitae ultricies. Tempus quam pellentesque nec nam aliquam sem et tortor. Morbi leo urna molestie at elementum eu facilisis sed. In fermentum posuere urna nec tincidunt. Neque aliquam vestibulum morbi blandit cursus risus. Vulputate dignissim suspendisse in est ante in nibh mauris cursus. Lorem ipsum dolor sit amet consectetur adipiscing. Orci eu lobortis elementum nibh tellus molestie nunc non. Enim diam vulputate ut pharetra sit amet aliquam. Convallis convallis tellus id interdum velit laoreet id donec ultrices. Sit amet mattis vulputate enim nulla aliquet porttitor lacus luctus. A lacus vestibulum sed arcu non odio. Ut tortor pretium viverra suspendisse potenti nullam ac tortor. Diam vel quam elementum pulvinar etiam non quam. Viverra justo nec ultrices dui. Eu volutpat odio facilisis mauris sit amet massa. Sed ullamcorper morbi tincidunt ornare massa eget egestas purus. Ac felis donec et odio pellentesque. Nisl vel pretium lectus quam id leo in. Ultricies lacus sed turpis tincidunt id. At urna condimentum mattis pellentesque id nibh tortor id. Sem nulla pharetra diam sit amet nisl suscipit. Neque viverra justo nec ultrices. Arcu cursus euismod quis viverra nibh cras pulvinar. Dolor sit amet consectetur adipiscing elit ut aliquam purus. Id diam vel quam elementum pulvinar etiam non. Elementum pulvinar etiam non quam lacus suspendisse faucibus. Id aliquet lectus proin nibh nisl condimentum id venenatis. Sit amet consectetur adipiscing elit duis tristique sollicitudin nibh. Sed faucibus turpis in eu mi bibendum neque egestas congue. Consectetur libero id faucibus nisl tincidunt eget nullam. At volutpat diam ut venenatis tellus in metus vulputate eu. Condimentum lacinia quis vel eros donec ac odio. Sit amet porttitor eget dolor morbi non arcu risus quis. Viverra mauris in aliquam sem fringilla ut morbi tincidunt. Metus dictum at tempor commodo ullamcorper. At ultrices mi tempus imperdiet nulla. Est ullamcorper eget nulla facilisi etiam dignissim diam quis. Lobortis elementum nibh tellus molestie nunc non. Placerat in egestas erat imperdiet sed. Placerat in egestas erat imperdiet sed euismod. Lobortis feugiat vivamus at augue eget arcu dictum varius. Ut sem nulla pharetra diam sit amet. Et tortor at risus viverra adipiscing at in. Tempor nec feugiat nisl pretium. Cursus euismod quis viverra nibh. Eget mi proin sed libero enim sed. Aliquam id diam maecenas ultricies. Mi tempus imperdiet nulla malesuada pellentesque elit eget. Gravida quis blandit turpis cursus in hac habitasse platea dictumst. Sed tempus urna et pharetra pharetra massa massa. Dolor purus non enim praesent elementum facilisis leo vel. Pharetra vel turpis nunc eget. Quam pellentesque nec nam aliquam sem et tortor consequat id. Orci eu lobortis elementum nibh tellus molestie nunc non. Porttitor leo a diam sollicitudin tempor id. Tincidunt ornare massa eget egestas purus viverra accumsan in nisl. Quam lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Elit ut aliquam purus sit amet luctus venenatis lectus. Velit egestas dui id ornare arcu odio ut sem nulla. Lacus viverra vitae congue eu consequat ac felis donec. Nulla aliquet porttitor lacus luctus accumsan tortor posuere ac ut. Lorem dolor sed viverra ipsum. Blandit libero volutpat sed cras ornare arcu. Egestas erat imperdiet sed euismod nisi porta lorem mollis. Viverra maecenas accumsan lacus vel. Enim neque volutpat ac tincidunt. Porttitor massa id neque aliquam vestibulum morbi blandit cursus risus. Malesuada bibendum arcu vitae elementum curabitur vitae nunc. Et malesuada fames ac turpis egestas integer. Egestas egestas fringilla phasellus faucibus scelerisque eleifend donec pretium. Est placerat in egestas erat imperdiet sed. Non arcu risus quis varius quam quisque. Lorem mollis aliquam ut porttitor leo a. Viverra tellus in hac habitasse platea dictumst vestibulum rhoncus. Fermentum iaculis eu non diam. Erat imperdiet sed euismod nisi porta lorem mollis aliquam. Varius vel pharetra vel turpis nunc eget lorem dolor. Rhoncus mattis rhoncus urna neque viverra. Hac habitasse platea dictumst quisque sagittis purus sit. At quis risus sed vulputate odio ut enim. Pharetra magna ac placerat vestibulum lectus mauris ultrices eros. Rutrum quisque non tellus orci ac auctor. Iaculis eu non diam phasellus vestibulum lorem sed. Ut sem nulla pharetra diam sit amet nisl suscipit. Risus at ultrices mi tempus. Vitae tortor condimentum lacinia quis vel eros donec. Sed tempus urna et pharetra. Posuere sollicitudin aliquam ultrices sagittis orci. Congue quisque egestas diam in arcu. Hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Pellentesque habitant morbi tristique senectus et netus et. Id interdum velit laoreet id. Fusce ut placerat orci nulla pellentesque dignissim. Pretium nibh ipsum consequat nisl vel pretium. Etiam erat velit scelerisque in dictum non consectetur a. Turpis in eu mi bibendum neque egestas congue quisque egestas. Pulvinar sapien et ligula ullamcorper malesuada. Ultricies tristique nulla aliquet enim tortor at. Suspendisse interdum consectetur libero id faucibus. Lorem sed risus ultricies tristique nulla aliquet. Tristique senectus et netus et malesuada fames. Eu augue ut lectus arcu bibendum at varius vel. Egestas sed tempus urna et pharetra pharetra massa massa ultricies. Aliquet eget sit amet tellus cras adipiscing. Massa placerat duis ultricies lacus sed turpis tincidunt id aliquet. Ornare massa eget egestas purus viverra accumsan in nisl. Justo laoreet sit amet cursus sit amet. In metus vulputate eu scelerisque felis imperdiet proin. At erat pellentesque adipiscing commodo elit at. Ipsum suspendisse ultrices gravida dictum fusce. Lectus sit amet est placerat in egestas erat. Aliquam ultrices sagittis orci a. Sagittis id consectetur purus ut faucibus pulvinar elementum. Ornare arcu odio ut sem nulla pharetra diam. Sit amet purus gravida quis blandit turpis cursus. Duis ultricies lacus sed turpis tincidunt. Malesuada fames ac turpis egestas sed tempus urna et. Viverra ipsum nunc aliquet bibendum enim facilisis. Et pharetra pharetra massa massa ultricies mi quis. Eget duis at tellus at urna condimentum mattis. Euismod in pellentesque massa placerat. Enim nunc faucibus a pellentesque sit amet porttitor. Dolor sed viverra ipsum nunc aliquet. Donec enim diam vulputate ut pharetra sit amet. Feugiat sed lectus vestibulum mattis ullamcorper velit sed. Erat pellentesque adipiscing commodo elit at imperdiet. Nisl purus in mollis nunc sed id semper risus. Tincidunt augue interdum velit euismod in pellentesque massa. Facilisis magna etiam tempor orci. Mauris in aliquam sem fringilla ut. Gravida dictum fusce ut placerat orci. Sed risus ultricies tristique nulla. Odio morbi quis commodo odio. Feugiat in ante metus dictum at tempor commodo ullamcorper. Porta non pulvinar neque laoreet suspendisse interdum. Etiam tempor orci eu lobortis elementum. Fusce ut placerat orci nulla pellentesque dignissim. Ornare lectus sit amet est placerat in egestas erat. Quis vel eros donec ac. Elementum pulvinar etiam non quam lacus. Sit amet tellus cras adipiscing enim eu turpis. Amet tellus cras adipiscing enim eu. Sed faucibus turpis in eu mi bibendum. Lectus proin nibh nisl condimentum id. Sollicitudin nibh sit amet commodo nulla. Sed tempus urna et pharetra pharetra massa massa. Magna eget est lorem ipsum. Elit ullamcorper dignissim cras tincidunt lobortis feugiat vivamus at. Fermentum dui faucibus in ornare quam viverra orci sagittis eu. Dignissim convallis aenean et tortor. Ut faucibus pulvinar elementum integer enim neque. Nibh cras pulvinar mattis nunc sed. Pellentesque sit amet porttitor eget dolor morbi. Mi eget mauris pharetra et ultrices neque ornare aenean euismod. Quis risus sed vulputate odio ut enim blandit volutpat. Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. In vitae turpis massa sed elementum tempus egestas sed sed. Urna id volutpat lacus laoreet non. Egestas pretium aenean pharetra magna ac placerat. Amet commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Donec et odio pellentesque diam volutpat commodo sed. Etiam non quam lacus suspendisse. Augue neque gravida in fermentum et sollicitudin ac orci. Eu feugiat pretium nibh ipsum. Nam at lectus urna duis convallis convallis tellus id. Egestas integer eget aliquet nibh. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae auctor. Urna condimentum mattis pellentesque id nibh tortor id. In egestas erat imperdiet sed euismod. Ut sem viverra aliquet eget sit amet tellus. Feugiat pretium nibh ipsum consequat nisl vel pretium. Volutpat odio facilisis mauris sit amet. Mi sit amet mauris commodo quis imperdiet massa tincidunt. Neque volutpat ac tincidunt vitae semper quis lectus nulla at. Nec feugiat in fermentum posuere urna nec. Ut venenatis tellus in metus vulputate eu. Vestibulum rhoncus est pellentesque elit ullamcorper dignissim. Eu scelerisque felis imperdiet proin. Vitae et leo duis ut diam quam nulla. Ut venenatis tellus in metus vulputate eu scelerisque. Tincidunt dui ut ornare lectus sit amet. Adipiscing diam donec adipiscing tristique risus. Turpis nunc eget lorem dolor sed viverra ipsum nunc aliquet. Non sodales neque sodales ut. Massa placerat duis ultricies lacus sed turpis tincidunt. Viverra orci sagittis eu volutpat odio facilisis mauris sit amet. Adipiscing vitae proin sagittis nisl. Vitae aliquet nec ullamcorper sit. Potenti nullam ac tortor vitae purus. Ultricies lacus sed turpis tincidunt id. Ut diam quam nulla porttitor massa id neque aliquam vestibulum. Semper eget duis at tellus at urna condimentum mattis pellentesque. Nec tincidunt praesent semper feugiat nibh sed pulvinar proin. Dictum fusce ut placerat orci nulla pellentesque dignissim. Amet luctus venenatis lectus magna fringilla urna. Quam quisque id diam vel quam elementum pulvinar. At tempor commodo ullamcorper a. Magna etiam tempor orci eu lobortis. Suspendisse ultrices gravida dictum fusce. Massa ultricies mi quis hendrerit dolor magna. Massa tincidunt nunc pulvinar sapien et ligula ullamcorper malesuada proin. Aliquet enim tortor at auctor urna nunc id. Semper feugiat nibh sed pulvinar proin gravida. Porttitor rhoncus dolor purus non enim. Metus aliquam eleifend mi in nulla. Lectus arcu bibendum at varius vel pharetra. Sed vulputate odio ut enim blandit volutpat. Et ligula ullamcorper malesuada proin libero nunc consequat interdum varius. Donec et odio pellentesque diam volutpat commodo. Id ornare arcu odio ut sem nulla pharetra diam sit. Est ullamcorper eget nulla facilisi etiam dignissim diam quis enim. Sagittis vitae et leo duis ut diam quam nulla. Elementum nisi quis eleifend quam. Congue mauris rhoncus aenean vel elit. Adipiscing elit duis tristique sollicitudin nibh sit. Egestas egestas fringilla phasellus faucibus scelerisque. Morbi tincidunt augue interdum velit euismod. Massa sed elementum tempus egestas sed sed. Id leo in vitae turpis massa sed elementum tempus egestas. In pellentesque massa placerat duis ultricies lacus sed turpis. Vitae proin sagittis nisl rhoncus mattis rhoncus. Enim tortor at auctor urna nunc id. In fermentum posuere urna nec tincidunt praesent semper feugiat nibh. Aliquam ut porttitor leo a diam sollicitudin tempor id. Pellentesque elit eget gravida cum sociis natoque. Molestie at elementum eu facilisis sed odio morbi quis. Tristique senectus et netus et malesuada fames ac turpis. Proin libero nunc consequat interdum varius sit amet mattis. Pellentesque id nibh tortor id. Risus sed vulputate odio ut enim blandit. Laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt eget. Morbi tincidunt augue interdum velit euismod in pellentesque. Pharetra pharetra massa massa ultricies mi quis hendrerit. Nunc aliquet bibendum enim facilisis gravida neque. Feugiat sed lectus vestibulum mattis ullamcorper velit sed ullamcorper. Risus quis varius quam quisque id diam vel. Et ultrices neque ornare aenean. Aliquet sagittis id consectetur purus ut faucibus pulvinar elementum. Nibh ipsum consequat nisl vel. Mauris rhoncus aenean vel elit scelerisque mauris pellentesque pulvinar. Ornare quam viverra orci sagittis eu volutpat odio facilisis. Euismod nisi porta lorem mollis aliquam. Enim ut tellus elementum sagittis. Rhoncus mattis rhoncus urna neque. Malesuada fames ac turpis egestas. Cursus in hac habitasse platea dictumst quisque sagittis. Sit amet aliquam id diam maecenas ultricies mi eget mauris. Enim sit amet venenatis urna cursus eget nunc. Fermentum odio eu feugiat pretium nibh ipsum consequat. Eu scelerisque felis imperdiet proin. Nullam non nisi est sit amet facilisis magna etiam tempor. In mollis nunc sed id semper risus in hendrerit. Sollicitudin nibh sit amet commodo nulla facilisi nullam. Sit amet nisl purus in mollis nunc sed id. Nam libero justo laoreet sit amet cursus sit amet dictum. Condimentum id venenatis a condimentum vitae sapien pellentesque. Porta nibh venenatis cras sed felis. Lectus nulla at volutpat diam ut venenatis tellus in. Aliquam etiam erat velit scelerisque in dictum non consectetur a. Leo vel fringilla est ullamcorper eget. Sodales ut etiam sit amet nisl purus in mollis nunc. Euismod nisi porta lorem mollis aliquam. Ornare arcu odio ut sem nulla. Sed felis eget velit aliquet sagittis id consectetur. Pellentesque nec nam aliquam sem et tortor consequat id. Enim nec dui nunc mattis enim ut tellus elementum. Nullam non nisi est sit amet facilisis magna. Rutrum quisque non tellus orci ac auctor augue. Nunc vel risus commodo viverra maecenas accumsan lacus. Viverra vitae congue eu consequat. Sollicitudin nibh sit amet commodo nulla. Amet volutpat consequat mauris nunc congue nisi. Maecenas pharetra convallis posuere morbi leo urna molestie at. Mattis vulputate enim nulla aliquet porttitor lacus luctus accumsan tortor. Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc consequat. Adipiscing diam donec adipiscing tristique risus. Elementum curabitur vitae nunc sed velit dignissim sodales ut. Eleifend donec pretium vulputate sapien nec. Commodo quis imperdiet massa tincidunt nunc pulvinar. Proin libero nunc consequat interdum varius sit amet mattis. Facilisis gravida neque convallis a cras semper auctor neque vitae. Quisque egestas diam in arcu cursus. Nunc eget lorem dolor sed viverra ipsum. Mauris sit amet massa vitae tortor condimentum lacinia quis vel. Aliquam sem et tortor consequat id porta nibh venenatis cras. Nunc sed id semper risus in. Enim sed faucibus turpis in eu mi bibendum neque. Molestie nunc non blandit massa enim. Enim praesent elementum facilisis leo vel fringilla est ullamcorper. Semper risus in hendrerit gravida rutrum quisque non tellus orci. Ac turpis egestas maecenas pharetra. In nulla posuere sollicitudin aliquam. Justo nec ultrices dui sapien eget mi proin sed libero. In ornare quam viverra orci sagittis eu. Proin nibh nisl condimentum id venenatis. Morbi enim nunc faucibus a pellentesque sit amet porttitor eget. Quis risus sed vulputate odio ut enim blandit. Risus feugiat in ante metus dictum at tempor commodo. Sodales neque sodales ut etiam. Nunc id cursus metus aliquam. Gravida dictum fusce ut placerat orci nulla pellentesque dignissim enim. Augue ut lectus arcu bibendum at. Quis varius quam quisque id diam vel quam. Egestas congue quisque egestas diam in arcu. Condimentum mattis pellentesque id nibh tortor id aliquet lectus. Enim lobortis scelerisque fermentum dui faucibus in. In tellus integer feugiat scelerisque varius morbi enim nunc. Mattis molestie a iaculis at erat pellentesque. Elit scelerisque mauris pellentesque pulvinar pellentesque habitant morbi tristique. Lorem ipsum dolor sit amet consectetur adipiscing elit ut aliquam. Nisl rhoncus mattis rhoncus urna neque. Ac auctor augue mauris augue neque gravida in fermentum et. Sodales ut eu sem integer vitae justo eget. Sed egestas egestas fringilla phasellus. Viverra adipiscing at in tellus integer feugiat scelerisque varius. Purus gravida quis blandit turpis. Id porta nibh venenatis cras sed. Mattis vulputate enim nulla aliquet porttitor lacus. Augue eget arcu dictum varius duis at consectetur lorem donec. Nulla at volutpat diam ut venenatis tellus in metus. Aliquam etiam erat velit scelerisque in dictum non consectetur. Turpis cursus in hac habitasse platea dictumst. Consequat mauris nunc congue nisi vitae suscipit tellus. Volutpat maecenas volutpat blandit aliquam etiam. Massa massa ultricies mi quis hendrerit dolor magna eget est. Velit egestas dui id ornare arcu. Non consectetur a erat nam at. Orci sagittis eu volutpat odio facilisis mauris sit amet. Dui id ornare arcu odio. Sed arcu non odio euismod lacinia. Feugiat in ante metus dictum. Gravida arcu ac tortor dignissim convallis. Egestas sed tempus urna et pharetra pharetra massa massa. Nulla facilisi nullam vehicula ipsum a arcu. Ipsum a arcu cursus vitae congue mauris. Porttitor rhoncus dolor purus non. Magna sit amet purus gravida quis blandit. Sapien eget mi proin sed libero enim sed faucibus turpis. Nisl nunc mi ipsum faucibus vitae aliquet nec ullamcorper sit. Pellentesque dignissim enim sit amet venenatis urna cursus eget. Pharetra massa massa ultricies mi quis hendrerit. Sapien nec sagittis aliquam malesuada bibendum. Nunc scelerisque viverra mauris in aliquam sem fringilla ut. Dolor magna eget est lorem ipsum dolor. Amet commodo nulla facilisi nullam. Pellentesque elit ullamcorper dignissim cras. Id porta nibh venenatis cras sed felis eget. Nam at lectus urna duis. Laoreet non curabitur gravida arcu ac tortor dignissim convallis. Nunc lobortis mattis aliquam faucibus purus in massa tempor. Sit amet luctus venenatis lectus magna fringilla. Duis ultricies lacus sed turpis tincidunt id. Sed velit dignissim sodales ut eu. Ut tortor pretium viverra suspendisse potenti nullam. Iaculis at erat pellentesque adipiscing. Ipsum nunc aliquet bibendum enim facilisis gravida neque. Nulla aliquet enim tortor at auctor urna nunc id cursus. Amet cursus sit amet dictum sit amet justo donec enim. Enim nunc faucibus a pellentesque sit amet porttitor eget dolor. Pharetra magna ac placerat vestibulum lectus mauris ultrices eros in. Nulla facilisi etiam dignissim diam quis enim. Ut enim blandit volutpat maecenas volutpat blandit aliquam etiam erat. Imperdiet proin fermentum leo vel orci porta non pulvinar neque. Vel fringilla est ullamcorper eget nulla. Bibendum neque egestas congue quisque egestas diam in arcu cursus. Ipsum nunc aliquet bibendum enim facilisis gravida neque convallis a. Arcu cursus vitae congue mauris rhoncus aenean vel elit. Augue eget arcu dictum varius duis. Tristique et egestas quis ipsum. Quis varius quam quisque id. Varius sit amet mattis vulputate. Mattis molestie a iaculis at erat pellentesque. Libero justo laoreet sit amet cursus. Aliquam id diam maecenas ultricies mi eget mauris pharetra. Ut eu sem integer vitae justo eget. Fames ac turpis egestas sed. Suspendisse in est ante in nibh mauris cursus mattis. Faucibus pulvinar elementum integer enim neque volutpat ac tincidunt vitae. Neque vitae tempus quam pellentesque nec nam aliquam. Lobortis elementum nibh tellus molestie nunc non. Lacus vel facilisis volutpat est velit egestas dui. Justo laoreet sit amet cursus sit amet dictum sit amet. Adipiscing enim eu turpis egestas pretium aenean pharetra magna. Cursus metus aliquam eleifend mi in nulla posuere. Nibh mauris cursus mattis molestie a. Dignissim diam quis enim lobortis scelerisque fermentum. A scelerisque purus semper eget duis at tellus. Lacus sed turpis tincidunt id aliquet risus feugiat in. Non tellus orci ac auctor. Ultrices in iaculis nunc sed augue lacus. Tincidunt tortor aliquam nulla facilisi cras. Nulla facilisi nullam vehicula ipsum a arcu cursus vitae congue. Eget magna fermentum iaculis eu non diam phasellus. Pharetra massa massa ultricies mi quis. Eget mauris pharetra et ultrices neque ornare. Aliquam faucibus purus in massa. Facilisi morbi tempus iaculis urna id volutpat lacus. Accumsan lacus vel facilisis volutpat. Curabitur gravida arcu ac tortor. Quam lacus suspendisse faucibus interdum. Elementum nibh tellus molestie nunc non blandit massa enim. Libero id faucibus nisl tincidunt. Bibendum ut tristique et egestas. Ut diam quam nulla porttitor massa id neque aliquam vestibulum. Augue interdum velit euismod in pellentesque. Adipiscing diam donec adipiscing tristique risus nec feugiat. Fringilla ut morbi tincidunt augue interdum velit. Vitae et leo duis ut diam quam nulla porttitor massa. Egestas integer eget aliquet nibh praesent tristique. Posuere sollicitudin aliquam ultrices sagittis orci a. Nisi est sit amet facilisis. Risus quis varius quam quisque id diam. Faucibus turpis in eu mi. Et molestie ac feugiat sed lectus vestibulum. Porttitor lacus luctus accumsan tortor posuere ac. Platea dictumst vestibulum rhoncus est pellentesque. Tortor pretium viverra suspendisse potenti nullam ac tortor. Enim praesent elementum facilisis leo vel fringilla est. Proin libero nunc consequat interdum varius sit amet mattis vulputate. Turpis egestas pretium aenean pharetra magna ac placerat vestibulum lectus. Nulla pharetra diam sit amet nisl suscipit. Mauris nunc congue nisi vitae suscipit tellus mauris a diam. Faucibus in ornare quam viverra orci sagittis eu volutpat. Volutpat consequat mauris nunc congue nisi vitae. Dui nunc mattis enim ut tellus. Adipiscing elit ut aliquam purus sit amet luctus. Tempus egestas sed sed risus. Scelerisque fermentum dui faucibus in ornare quam viverra orci. Massa ultricies mi quis hendrerit dolor magna eget. Pulvinar mattis nunc sed blandit libero volutpat sed cras ornare. Ut eu sem integer vitae justo eget magna fermentum. Ornare quam viverra orci sagittis. Eget dolor morbi non arcu risus quis varius quam. Tincidunt praesent semper feugiat nibh sed pulvinar. Sit amet justo donec enim diam vulputate. Dui faucibus in ornare quam viverra. Tincidunt tortor aliquam nulla facilisi cras fermentum odio eu. Turpis egestas sed tempus urna et. Pretium quam vulputate dignissim suspendisse in est ante in. Morbi quis commodo odio aenean sed adipiscing diam donec. Nunc mattis enim ut tellus elementum sagittis vitae et. Diam vel quam elementum pulvinar etiam non quam. Convallis posuere morbi leo urna molestie at elementum eu. Adipiscing at in tellus integer feugiat scelerisque varius morbi. Quis varius quam quisque id diam vel quam elementum. Dui accumsan sit amet nulla. Adipiscing elit duis tristique sollicitudin nibh sit amet commodo. Viverra ipsum nunc aliquet bibendum enim facilisis. Porta lorem mollis aliquam ut. Velit ut tortor pretium viverra suspendisse potenti. Quis viverra nibh cras pulvinar mattis nunc sed blandit. Pharetra magna ac placerat vestibulum. Mauris ultrices eros in cursus turpis massa. Lacus vestibulum sed arcu non odio euismod lacinia at. Dapibus ultrices in iaculis nunc sed. Cras adipiscing enim eu turpis egestas. Eget arcu dictum varius duis at consectetur. Consequat id porta nibh venenatis cras sed felis eget velit. Integer enim neque volutpat ac tincidunt vitae. Feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Ut morbi tincidunt augue interdum velit euismod. Sed cras ornare arcu dui vivamus arcu felis bibendum ut. Eget felis eget nunc lobortis mattis aliquam faucibus purus in. Luctus venenatis lectus magna fringilla urna porttitor rhoncus dolor. Nisl nunc mi ipsum faucibus vitae. Proin fermentum leo vel orci porta. Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Et leo duis ut diam quam. Eros in cursus turpis massa tincidunt. Volutpat est velit egestas dui id. Commodo odio aenean sed adipiscing diam. Quis blandit turpis cursus in hac habitasse platea dictumst quisque. Magna fringilla urna porttitor rhoncus dolor. Amet consectetur adipiscing elit ut aliquam purus sit amet. Vitae justo eget magna fermentum iaculis eu non diam. Hendrerit dolor magna eget est. Ac placerat vestibulum lectus mauris ultrices eros in cursus turpis. Egestas diam in arcu cursus. At varius vel pharetra vel turpis nunc. Lacus vel facilisis volutpat est velit. Ut ornare lectus sit amet est placerat in egestas. Quam adipiscing vitae proin sagittis nisl rhoncus. Dolor purus non enim praesent. Urna condimentum mattis pellentesque id. Magnis dis parturient montes nascetur ridiculus. Feugiat nisl pretium fusce id. Sed cras ornare arcu dui vivamus. Vitae turpis massa sed elementum tempus egestas sed sed. Ac feugiat sed lectus vestibulum mattis ullamcorper velit sed ullamcorper. Ac ut consequat semper viverra nam libero. Consectetur lorem donec massa sapien faucibus. Purus viverra accumsan in nisl nisi scelerisque eu ultrices. Eu turpis egestas pretium aenean pharetra. Nisl rhoncus mattis rhoncus urna neque viverra justo nec ultrices. Pellentesque sit amet porttitor eget dolor morbi non arcu. Vitae justo eget magna fermentum iaculis. Quis auctor elit sed vulputate mi sit. Purus viverra accumsan in nisl nisi scelerisque eu ultrices. Semper auctor neque vitae tempus quam pellentesque nec nam. Rhoncus dolor purus non enim. Sed turpis tincidunt id aliquet risus feugiat. Sit amet justo donec enim diam vulputate ut pharetra sit. Risus pretium quam vulputate dignissim suspendisse in est ante in. Massa sapien faucibus et molestie ac feugiat. Id aliquet risus feugiat in ante metus. Risus ultricies tristique nulla aliquet enim tortor at auctor urna. Sed lectus vestibulum mattis ullamcorper velit sed ullamcorper morbi. Lacus sed turpis tincidunt id aliquet risus feugiat in. Risus ultricies tristique nulla aliquet enim tortor. In ornare quam viverra orci sagittis eu volutpat. Netus et malesuada fames ac turpis egestas sed tempus urna. Fames ac turpis egestas maecenas pharetra convallis posuere morbi. Etiam erat velit scelerisque in dictum non. Cursus turpis massa tincidunt dui ut ornare lectus. Tristique sollicitudin nibh sit amet commodo nulla facilisi. Pellentesque pulvinar pellentesque habitant morbi tristique senectus et. Aliquet eget sit amet tellus cras. Nullam ac tortor vitae purus faucibus ornare. Lacus viverra vitae congue eu consequat. Vulputate ut pharetra sit amet. Est ante in nibh mauris cursus mattis molestie a. Ipsum suspendisse ultrices gravida dictum fusce ut placerat orci. Et tortor at risus viverra. Sed libero enim sed faucibus turpis in eu. Id cursus metus aliquam eleifend mi in nulla posuere sollicitudin. Risus viverra adipiscing at in. Imperdiet massa tincidunt nunc pulvinar sapien et. Nec feugiat in fermentum posuere urna nec tincidunt. Ultricies mi eget mauris pharetra et. Morbi tristique senectus et netus et malesuada fames ac. At quis risus sed vulputate. Interdum velit laoreet id donec. Sapien pellentesque habitant morbi tristique. Pharetra vel turpis nunc eget lorem dolor sed viverra. In massa tempor nec feugiat nisl. Massa tincidunt nunc pulvinar sapien et ligula ullamcorper malesuada proin. Mauris augue neque gravida in. Faucibus vitae aliquet nec ullamcorper sit amet risus. Id velit ut tortor pretium viverra suspendisse potenti. Leo integer malesuada nunc vel risus commodo viverra maecenas. Risus quis varius quam quisque id. Aliquam malesuada bibendum arcu vitae elementum curabitur vitae. Vestibulum lectus mauris ultrices eros in cursus turpis. Fermentum posuere urna nec tincidunt. Magna etiam tempor orci eu lobortis elementum nibh tellus molestie. Id ornare arcu odio ut. Facilisi nullam vehicula ipsum a arcu cursus vitae congue. Nulla pellentesque dignissim enim sit amet venenatis urna cursus eget. Viverra mauris in aliquam sem fringilla ut morbi tincidunt. Quis ipsum suspendisse ultrices gravida dictum fusce ut placerat orci. Sed cras ornare arcu dui vivamus arcu felis. Egestas diam in arcu cursus euismod quis. Tincidunt dui ut ornare lectus. Morbi tristique senectus et netus et. Ornare arcu dui vivamus arcu felis bibendum ut tristique. Habitant morbi tristique senectus et netus et malesuada fames ac. Ut tristique et egestas quis. Mollis aliquam ut porttitor leo. Venenatis tellus in metus vulputate eu scelerisque felis imperdiet proin. Sagittis eu volutpat odio facilisis mauris sit amet massa. Eu facilisis sed odio morbi. Nunc consequat interdum varius sit amet mattis. Velit dignissim sodales ut eu. Pellentesque eu tincidunt tortor aliquam. Porta lorem mollis aliquam ut porttitor. Rhoncus urna neque viverra justo nec ultrices. Viverra suspendisse potenti nullam ac tortor vitae purus. Fermentum posuere urna nec tincidunt praesent semper feugiat nibh sed. Purus sit amet luctus venenatis lectus magna fringilla urna porttitor. Sed lectus vestibulum mattis ullamcorper velit sed ullamcorper. Nulla posuere sollicitudin aliquam ultrices sagittis orci a scelerisque. Nisl nisi scelerisque eu ultrices vitae auctor. In vitae turpis massa sed elementum tempus egestas. Cursus sit amet dictum sit amet justo donec enim. Vitae congue eu consequat ac felis donec et. Augue interdum velit euismod in pellentesque massa placerat. Enim ut sem viverra aliquet eget sit amet. Velit scelerisque in dictum non consectetur a erat. Sed lectus vestibulum mattis ullamcorper velit sed ullamcorper. Nunc faucibus a pellentesque sit amet porttitor eget. Tellus integer feugiat scelerisque varius morbi. Lorem sed risus ultricies tristique nulla aliquet enim tortor at. Eget nulla facilisi etiam dignissim diam quis enim lobortis scelerisque. Adipiscing elit duis tristique sollicitudin. Adipiscing elit pellentesque habitant morbi tristique. Ac tincidunt vitae semper quis lectus nulla at. Maecenas sed enim ut sem viverra. Erat pellentesque adipiscing commodo elit at imperdiet. Dolor morbi non arcu risus quis varius quam quisque. Fringilla urna porttitor rhoncus dolor purus non enim praesent. Tellus integer feugiat scelerisque varius morbi enim nunc faucibus a. Felis eget nunc lobortis mattis aliquam faucibus purus in. Fringilla phasellus faucibus scelerisque eleifend. Pulvinar etiam non quam lacus suspendisse faucibus interdum posuere. Risus ultricies tristique nulla aliquet. Lectus sit amet est placerat. Ac ut consequat semper viverra nam libero justo. Dapibus ultrices in iaculis nunc sed augue. Mattis ullamcorper velit sed ullamcorper. Eget nullam non nisi est. Vitae elementum curabitur vitae nunc sed velit. Sit amet commodo nulla facilisi nullam vehicula ipsum a arcu. Tempor nec feugiat nisl pretium fusce id velit ut. Nulla pellentesque dignissim enim sit amet venenatis. Sed tempus urna et pharetra pharetra. Congue quisque egestas diam in. Convallis posuere morbi leo urna. Nec tincidunt praesent semper feugiat nibh sed pulvinar proin gravida. Sagittis nisl rhoncus mattis rhoncus urna neque viverra justo. Scelerisque felis imperdiet proin fermentum leo vel. Ut placerat orci nulla pellentesque dignissim enim sit amet. In cursus turpis massa tincidunt dui. Rutrum quisque non tellus orci ac auctor augue mauris augue. Cursus vitae congue mauris rhoncus aenean vel elit scelerisque mauris. Scelerisque fermentum dui faucibus in ornare quam viverra orci. Habitant morbi tristique senectus et netus et. Ridiculus mus mauris vitae ultricies leo. Vitae semper quis lectus nulla at volutpat diam. Purus faucibus ornare suspendisse sed nisi. Enim lobortis scelerisque fermentum dui faucibus in ornare quam. Mi tempus imperdiet nulla malesuada pellentesque elit eget. Varius duis at consectetur lorem donec. Pulvinar pellentesque habitant morbi tristique senectus et netus et. A iaculis at erat pellentesque adipiscing commodo elit at imperdiet. Mi ipsum faucibus vitae aliquet nec. Libero volutpat sed cras ornare arcu dui vivamus arcu. Natoque penatibus et magnis dis parturient montes nascetur ridiculus. Maecenas volutpat blandit aliquam etiam erat velit scelerisque. Cras adipiscing enim eu turpis. Nec tincidunt praesent semper feugiat nibh sed pulvinar. Justo laoreet sit amet cursus sit amet dictum sit. Velit scelerisque in dictum non consectetur a erat nam. Turpis tincidunt id aliquet risus feugiat in ante. Aliquet risus feugiat in ante metus dictum. Hac habitasse platea dictumst quisque sagittis purus sit. Et pharetra pharetra massa massa ultricies. Sit amet nisl suscipit adipiscing bibendum est ultricies integer. Venenatis urna cursus eget nunc scelerisque viverra mauris in. Integer quis auctor elit sed. In est ante in nibh mauris cursus mattis molestie. Scelerisque in dictum non consectetur a erat nam at. Lectus sit amet est placerat in. Sit amet cursus sit amet. Nibh nisl condimentum id venenatis a condimentum. Purus ut faucibus pulvinar elementum integer enim. Pharetra sit amet aliquam id diam maecenas. Id cursus metus aliquam eleifend mi in nulla posuere. Lobortis mattis aliquam faucibus purus in massa tempor nec. Urna neque viverra justo nec ultrices dui sapien eget. Enim ut sem viverra aliquet eget sit amet. In eu mi bibendum neque egestas congue quisque egestas. Enim neque volutpat ac tincidunt. Orci ac auctor augue mauris augue neque gravida in fermentum. Velit aliquet sagittis id consectetur. Enim ut sem viverra aliquet eget sit amet tellus. Semper auctor neque vitae tempus quam pellentesque nec. Non blandit massa enim nec dui nunc. Morbi blandit cursus risus at ultrices mi tempus imperdiet nulla. Arcu non odio euismod lacinia at quis risus. Dictum varius duis at consectetur lorem donec massa. Blandit massa enim nec dui. Nibh ipsum consequat nisl vel. Turpis in eu mi bibendum neque. Ut tristique et egestas quis. Ac odio tempor orci dapibus. Gravida dictum fusce ut placerat orci nulla pellentesque dignissim. Integer feugiat scelerisque varius morbi enim. Libero volutpat sed cras ornare arcu dui. Odio aenean sed adipiscing diam. Et egestas quis ipsum suspendisse ultrices. Aliquet lectus proin nibh nisl condimentum. Sit amet consectetur adipiscing elit duis tristique sollicitudin nibh sit. Blandit massa enim nec dui. Tellus molestie nunc non blandit massa enim nec. Tortor vitae purus faucibus ornare suspendisse sed nisi. Nascetur ridiculus mus mauris vitae ultricies leo. Elementum facilisis leo vel fringilla est ullamcorper eget nulla. Diam maecenas ultricies mi eget. Duis tristique sollicitudin nibh sit amet commodo nulla. Tempus iaculis urna id volutpat lacus laoreet non curabitur gravida. Dictumst quisque sagittis purus sit amet. Viverra mauris in aliquam sem. Quis risus sed vulputate odio ut enim blandit volutpat maecenas. Condimentum mattis pellentesque id nibh tortor id. Non sodales neque sodales ut etiam sit amet. Ipsum consequat nisl vel pretium. Cursus in hac habitasse platea dictumst quisque sagittis purus sit. Fringilla est ullamcorper eget nulla facilisi etiam. Tellus elementum sagittis vitae et leo duis ut diam quam. Nisl vel pretium lectus quam id leo in.'
diff --git a/tests/data/valid/toml-lang-compliance/valid/qa/qa-scalar-literal-multiline-40kb.json b/tests/data/valid/toml-lang-compliance/valid/qa/qa-scalar-literal-multiline-40kb.json
new file mode 100644
index 0000000..d493410
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/qa/qa-scalar-literal-multiline-40kb.json
@@ -0,0 +1,2 @@
+{"long":
+ {"type":"string","value":"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Quam lacus suspendisse faucibus interdum posuere lorem ipsum dolor. Amet consectetur adipiscing elit ut. Nulla facilisi etiam dignissim diam quis enim lobortis. Curabitur vitae nunc sed velit dignissim sodales ut eu. Fames ac turpis egestas sed tempus urna et. Facilisi cras fermentum odio eu feugiat pretium. Nec tincidunt praesent semper feugiat nibh sed pulvinar proin gravida. Est lorem ipsum dolor sit amet consectetur adipiscing elit. Vel quam elementum pulvinar etiam non quam lacus. Pharetra et ultrices neque ornare aenean euismod. Nisl nisi scelerisque eu ultrices. Eget dolor morbi non arcu risus. Bibendum neque egestas congue quisque egestas diam in arcu cursus. Faucibus nisl tincidunt eget nullam. Nisl pretium fusce id velit ut tortor pretium viverra suspendisse. Mauris ultrices eros in cursus. Donec ac odio tempor orci dapibus ultrices in iaculis. Tellus cras adipiscing enim eu turpis egestas pretium aenean pharetra.\n\nEros in cursus turpis massa. Nascetur ridiculus mus mauris vitae ultricies leo integer malesuada nunc. Velit sed ullamcorper morbi tincidunt ornare massa eget egestas purus. Aenean euismod elementum nisi quis eleifend quam. Magnis dis parturient montes nascetur ridiculus mus. Eu tincidunt tortor aliquam nulla facilisi cras. Tristique senectus et netus et malesuada fames. Urna nec tincidunt praesent semper feugiat nibh sed pulvinar. Vitae ultricies leo integer malesuada nunc vel risus commodo viverra. Ac turpis egestas sed tempus urna et. Amet mauris commodo quis imperdiet massa tincidunt. Urna nunc id cursus metus aliquam eleifend mi. In nulla posuere sollicitudin aliquam ultrices sagittis orci a scelerisque. Neque aliquam vestibulum morbi blandit cursus. Pulvinar mattis nunc sed blandit libero volutpat sed. Sed egestas egestas fringilla phasellus faucibus scelerisque eleifend donec pretium.\n\nBlandit cursus risus at ultrices mi tempus. Turpis massa sed elementum tempus egestas sed sed. Dictum varius duis at consectetur lorem. Commodo ullamcorper a lacus vestibulum sed arcu non. Dolor magna eget est lorem. Tincidunt arcu non sodales neque sodales ut etiam sit amet. Sit amet risus nullam eget felis eget nunc lobortis. Risus in hendrerit gravida rutrum quisque non tellus orci. Elementum pulvinar etiam non quam lacus suspendisse faucibus. Morbi tristique senectus et netus et malesuada. In aliquam sem fringilla ut morbi tincidunt. Ornare aenean euismod elementum nisi quis eleifend quam. Sed id semper risus in hendrerit gravida rutrum quisque. Lorem ipsum dolor sit amet consectetur adipiscing elit. A condimentum vitae sapien pellentesque habitant morbi tristique senectus et. Faucibus purus in massa tempor nec feugiat nisl. Vehicula ipsum a arcu cursus vitae congue. Facilisi cras fermentum odio eu feugiat pretium nibh. Viverra mauris in aliquam sem fringilla ut morbi tincidunt. Ultrices dui sapien eget mi proin sed libero enim.\n\nNisi est sit amet facilisis magna etiam tempor. Posuere ac ut consequat semper viverra nam. Dis parturient montes nascetur ridiculus mus mauris vitae. Nec sagittis aliquam malesuada bibendum. Mattis pellentesque id nibh tortor id aliquet lectus. Vitae congue eu consequat ac felis donec et. Cras sed felis eget velit aliquet sagittis id consectetur purus. Pellentesque elit ullamcorper dignissim cras tincidunt. Pellentesque dignissim enim sit amet venenatis urna. A cras semper auctor neque vitae tempus. Amet massa vitae tortor condimentum lacinia quis vel eros donec. Tempor commodo ullamcorper a lacus. Nibh tellus molestie nunc non blandit massa enim nec dui. Viverra orci sagittis eu volutpat odio facilisis mauris sit. Sed augue lacus viverra vitae. Vulputate eu scelerisque felis imperdiet proin fermentum leo vel orci. Tellus rutrum tellus pellentesque eu tincidunt tortor.\n\nCras semper auctor neque vitae tempus quam pellentesque nec. Lorem ipsum dolor sit amet consectetur adipiscing elit ut aliquam. Tristique magna sit amet purus gravida quis blandit turpis. Viverra ipsum nunc aliquet bibendum. Arcu bibendum at varius vel. Amet mattis vulputate enim nulla. Vulputate enim nulla aliquet porttitor. Volutpat blandit aliquam etiam erat velit scelerisque in dictum. Morbi tristique senectus et netus et malesuada fames ac. Faucibus et molestie ac feugiat sed.\n\nTellus elementum sagittis vitae et leo duis. Id aliquet lectus proin nibh. Ornare arcu dui vivamus arcu. Morbi tincidunt augue interdum velit euismod in pellentesque massa placerat. Quis eleifend quam adipiscing vitae. Tristique senectus et netus et malesuada fames ac turpis. Pharetra convallis posuere morbi leo. Ornare arcu odio ut sem nulla pharetra diam sit. Morbi tristique senectus et netus et. Dictum non consectetur a erat nam at lectus urna.\n\nVarius vel pharetra vel turpis. Mi ipsum faucibus vitae aliquet. Tellus in metus vulputate eu scelerisque felis imperdiet proin. In est ante in nibh mauris cursus mattis. Massa ultricies mi quis hendrerit dolor magna eget. Fermentum leo vel orci porta. Elit ut aliquam purus sit amet luctus venenatis lectus. Eget aliquet nibh praesent tristique magna sit amet. Arcu non odio euismod lacinia at quis. Montes nascetur ridiculus mus mauris vitae ultricies. Tempus quam pellentesque nec nam aliquam sem et tortor. Morbi leo urna molestie at elementum eu facilisis sed.\n\nIn fermentum posuere urna nec tincidunt. Neque aliquam vestibulum morbi blandit cursus risus. Vulputate dignissim suspendisse in est ante in nibh mauris cursus. Lorem ipsum dolor sit amet consectetur adipiscing. Orci eu lobortis elementum nibh tellus molestie nunc non. Enim diam vulputate ut pharetra sit amet aliquam. Convallis convallis tellus id interdum velit laoreet id donec ultrices. Sit amet mattis vulputate enim nulla aliquet porttitor lacus luctus. A lacus vestibulum sed arcu non odio. Ut tortor pretium viverra suspendisse potenti nullam ac tortor. Diam vel quam elementum pulvinar etiam non quam. Viverra justo nec ultrices dui. Eu volutpat odio facilisis mauris sit amet massa. Sed ullamcorper morbi tincidunt ornare massa eget egestas purus. Ac felis donec et odio pellentesque. Nisl vel pretium lectus quam id leo in. Ultricies lacus sed turpis tincidunt id.\n\nAt urna condimentum mattis pellentesque id nibh tortor id. Sem nulla pharetra diam sit amet nisl suscipit. Neque viverra justo nec ultrices. Arcu cursus euismod quis viverra nibh cras pulvinar. Dolor sit amet consectetur adipiscing elit ut aliquam purus. Id diam vel quam elementum pulvinar etiam non. Elementum pulvinar etiam non quam lacus suspendisse faucibus. Id aliquet lectus proin nibh nisl condimentum id venenatis. Sit amet consectetur adipiscing elit duis tristique sollicitudin nibh. Sed faucibus turpis in eu mi bibendum neque egestas congue. Consectetur libero id faucibus nisl tincidunt eget nullam. At volutpat diam ut venenatis tellus in metus vulputate eu. Condimentum lacinia quis vel eros donec ac odio. Sit amet porttitor eget dolor morbi non arcu risus quis. Viverra mauris in aliquam sem fringilla ut morbi tincidunt. Metus dictum at tempor commodo ullamcorper. At ultrices mi tempus imperdiet nulla. Est ullamcorper eget nulla facilisi etiam dignissim diam quis. Lobortis elementum nibh tellus molestie nunc non. Placerat in egestas erat imperdiet sed.\n\nPlacerat in egestas erat imperdiet sed euismod. Lobortis feugiat vivamus at augue eget arcu dictum varius. Ut sem nulla pharetra diam sit amet. Et tortor at risus viverra adipiscing at in. Tempor nec feugiat nisl pretium. Cursus euismod quis viverra nibh. Eget mi proin sed libero enim sed. Aliquam id diam maecenas ultricies. Mi tempus imperdiet nulla malesuada pellentesque elit eget. Gravida quis blandit turpis cursus in hac habitasse platea dictumst. Sed tempus urna et pharetra pharetra massa massa. Dolor purus non enim praesent elementum facilisis leo vel.\n\nPharetra vel turpis nunc eget. Quam pellentesque nec nam aliquam sem et tortor consequat id. Orci eu lobortis elementum nibh tellus molestie nunc non. Porttitor leo a diam sollicitudin tempor id. Tincidunt ornare massa eget egestas purus viverra accumsan in nisl. Quam lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Elit ut aliquam purus sit amet luctus venenatis lectus. Velit egestas dui id ornare arcu odio ut sem nulla. Lacus viverra vitae congue eu consequat ac felis donec. Nulla aliquet porttitor lacus luctus accumsan tortor posuere ac ut. Lorem dolor sed viverra ipsum. Blandit libero volutpat sed cras ornare arcu. Egestas erat imperdiet sed euismod nisi porta lorem mollis. Viverra maecenas accumsan lacus vel. Enim neque volutpat ac tincidunt. Porttitor massa id neque aliquam vestibulum morbi blandit cursus risus. Malesuada bibendum arcu vitae elementum curabitur vitae nunc.\n\nEt malesuada fames ac turpis egestas integer. Egestas egestas fringilla phasellus faucibus scelerisque eleifend donec pretium. Est placerat in egestas erat imperdiet sed. Non arcu risus quis varius quam quisque. Lorem mollis aliquam ut porttitor leo a. Viverra tellus in hac habitasse platea dictumst vestibulum rhoncus. Fermentum iaculis eu non diam. Erat imperdiet sed euismod nisi porta lorem mollis aliquam. Varius vel pharetra vel turpis nunc eget lorem dolor. Rhoncus mattis rhoncus urna neque viverra. Hac habitasse platea dictumst quisque sagittis purus sit. At quis risus sed vulputate odio ut enim. Pharetra magna ac placerat vestibulum lectus mauris ultrices eros. Rutrum quisque non tellus orci ac auctor. Iaculis eu non diam phasellus vestibulum lorem sed. Ut sem nulla pharetra diam sit amet nisl suscipit. Risus at ultrices mi tempus. Vitae tortor condimentum lacinia quis vel eros donec. Sed tempus urna et pharetra. Posuere sollicitudin aliquam ultrices sagittis orci.\n\nCongue quisque egestas diam in arcu. Hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Pellentesque habitant morbi tristique senectus et netus et. Id interdum velit laoreet id. Fusce ut placerat orci nulla pellentesque dignissim. Pretium nibh ipsum consequat nisl vel pretium. Etiam erat velit scelerisque in dictum non consectetur a. Turpis in eu mi bibendum neque egestas congue quisque egestas. Pulvinar sapien et ligula ullamcorper malesuada. Ultricies tristique nulla aliquet enim tortor at. Suspendisse interdum consectetur libero id faucibus. Lorem sed risus ultricies tristique nulla aliquet. Tristique senectus et netus et malesuada fames. Eu augue ut lectus arcu bibendum at varius vel. Egestas sed tempus urna et pharetra pharetra massa massa ultricies. Aliquet eget sit amet tellus cras adipiscing. Massa placerat duis ultricies lacus sed turpis tincidunt id aliquet. Ornare massa eget egestas purus viverra accumsan in nisl. Justo laoreet sit amet cursus sit amet.\n\nIn metus vulputate eu scelerisque felis imperdiet proin. At erat pellentesque adipiscing commodo elit at. Ipsum suspendisse ultrices gravida dictum fusce. Lectus sit amet est placerat in egestas erat. Aliquam ultrices sagittis orci a. Sagittis id consectetur purus ut faucibus pulvinar elementum. Ornare arcu odio ut sem nulla pharetra diam. Sit amet purus gravida quis blandit turpis cursus. Duis ultricies lacus sed turpis tincidunt. Malesuada fames ac turpis egestas sed tempus urna et. Viverra ipsum nunc aliquet bibendum enim facilisis. Et pharetra pharetra massa massa ultricies mi quis. Eget duis at tellus at urna condimentum mattis. Euismod in pellentesque massa placerat. Enim nunc faucibus a pellentesque sit amet porttitor. Dolor sed viverra ipsum nunc aliquet. Donec enim diam vulputate ut pharetra sit amet. Feugiat sed lectus vestibulum mattis ullamcorper velit sed. Erat pellentesque adipiscing commodo elit at imperdiet. Nisl purus in mollis nunc sed id semper risus.\n\nTincidunt augue interdum velit euismod in pellentesque massa. Facilisis magna etiam tempor orci. Mauris in aliquam sem fringilla ut. Gravida dictum fusce ut placerat orci. Sed risus ultricies tristique nulla. Odio morbi quis commodo odio. Feugiat in ante metus dictum at tempor commodo ullamcorper. Porta non pulvinar neque laoreet suspendisse interdum. Etiam tempor orci eu lobortis elementum. Fusce ut placerat orci nulla pellentesque dignissim. Ornare lectus sit amet est placerat in egestas erat. Quis vel eros donec ac. Elementum pulvinar etiam non quam lacus. Sit amet tellus cras adipiscing enim eu turpis. Amet tellus cras adipiscing enim eu. Sed faucibus turpis in eu mi bibendum. Lectus proin nibh nisl condimentum id.\n\nSollicitudin nibh sit amet commodo nulla. Sed tempus urna et pharetra pharetra massa massa. Magna eget est lorem ipsum. Elit ullamcorper dignissim cras tincidunt lobortis feugiat vivamus at. Fermentum dui faucibus in ornare quam viverra orci sagittis eu. Dignissim convallis aenean et tortor. Ut faucibus pulvinar elementum integer enim neque. Nibh cras pulvinar mattis nunc sed. Pellentesque sit amet porttitor eget dolor morbi. Mi eget mauris pharetra et ultrices neque ornare aenean euismod. Quis risus sed vulputate odio ut enim blandit volutpat. Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. In vitae turpis massa sed elementum tempus egestas sed sed. Urna id volutpat lacus laoreet non. Egestas pretium aenean pharetra magna ac placerat. Amet commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Donec et odio pellentesque diam volutpat commodo sed. Etiam non quam lacus suspendisse.\n\nAugue neque gravida in fermentum et sollicitudin ac orci. Eu feugiat pretium nibh ipsum. Nam at lectus urna duis convallis convallis tellus id. Egestas integer eget aliquet nibh. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae auctor. Urna condimentum mattis pellentesque id nibh tortor id. In egestas erat imperdiet sed euismod. Ut sem viverra aliquet eget sit amet tellus. Feugiat pretium nibh ipsum consequat nisl vel pretium. Volutpat odio facilisis mauris sit amet.\n\nMi sit amet mauris commodo quis imperdiet massa tincidunt. Neque volutpat ac tincidunt vitae semper quis lectus nulla at. Nec feugiat in fermentum posuere urna nec. Ut venenatis tellus in metus vulputate eu. Vestibulum rhoncus est pellentesque elit ullamcorper dignissim. Eu scelerisque felis imperdiet proin. Vitae et leo duis ut diam quam nulla. Ut venenatis tellus in metus vulputate eu scelerisque. Tincidunt dui ut ornare lectus sit amet. Adipiscing diam donec adipiscing tristique risus. Turpis nunc eget lorem dolor sed viverra ipsum nunc aliquet. Non sodales neque sodales ut. Massa placerat duis ultricies lacus sed turpis tincidunt. Viverra orci sagittis eu volutpat odio facilisis mauris sit amet.\n\nAdipiscing vitae proin sagittis nisl. Vitae aliquet nec ullamcorper sit. Potenti nullam ac tortor vitae purus. Ultricies lacus sed turpis tincidunt id. Ut diam quam nulla porttitor massa id neque aliquam vestibulum. Semper eget duis at tellus at urna condimentum mattis pellentesque. Nec tincidunt praesent semper feugiat nibh sed pulvinar proin. Dictum fusce ut placerat orci nulla pellentesque dignissim. Amet luctus venenatis lectus magna fringilla urna. Quam quisque id diam vel quam elementum pulvinar. At tempor commodo ullamcorper a. Magna etiam tempor orci eu lobortis. Suspendisse ultrices gravida dictum fusce. Massa ultricies mi quis hendrerit dolor magna.\n\nMassa tincidunt nunc pulvinar sapien et ligula ullamcorper malesuada proin. Aliquet enim tortor at auctor urna nunc id. Semper feugiat nibh sed pulvinar proin gravida. Porttitor rhoncus dolor purus non enim. Metus aliquam eleifend mi in nulla. Lectus arcu bibendum at varius vel pharetra. Sed vulputate odio ut enim blandit volutpat. Et ligula ullamcorper malesuada proin libero nunc consequat interdum varius. Donec et odio pellentesque diam volutpat commodo. Id ornare arcu odio ut sem nulla pharetra diam sit.\n\nEst ullamcorper eget nulla facilisi etiam dignissim diam quis enim. Sagittis vitae et leo duis ut diam quam nulla. Elementum nisi quis eleifend quam. Congue mauris rhoncus aenean vel elit. Adipiscing elit duis tristique sollicitudin nibh sit. Egestas egestas fringilla phasellus faucibus scelerisque. Morbi tincidunt augue interdum velit euismod. Massa sed elementum tempus egestas sed sed. Id leo in vitae turpis massa sed elementum tempus egestas. In pellentesque massa placerat duis ultricies lacus sed turpis. Vitae proin sagittis nisl rhoncus mattis rhoncus. Enim tortor at auctor urna nunc id. In fermentum posuere urna nec tincidunt praesent semper feugiat nibh. Aliquam ut porttitor leo a diam sollicitudin tempor id. Pellentesque elit eget gravida cum sociis natoque. Molestie at elementum eu facilisis sed odio morbi quis. Tristique senectus et netus et malesuada fames ac turpis. Proin libero nunc consequat interdum varius sit amet mattis. Pellentesque id nibh tortor id.\n\nRisus sed vulputate odio ut enim blandit. Laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt eget. Morbi tincidunt augue interdum velit euismod in pellentesque. Pharetra pharetra massa massa ultricies mi quis hendrerit. Nunc aliquet bibendum enim facilisis gravida neque. Feugiat sed lectus vestibulum mattis ullamcorper velit sed ullamcorper. Risus quis varius quam quisque id diam vel. Et ultrices neque ornare aenean. Aliquet sagittis id consectetur purus ut faucibus pulvinar elementum. Nibh ipsum consequat nisl vel. Mauris rhoncus aenean vel elit scelerisque mauris pellentesque pulvinar. Ornare quam viverra orci sagittis eu volutpat odio facilisis. Euismod nisi porta lorem mollis aliquam. Enim ut tellus elementum sagittis. Rhoncus mattis rhoncus urna neque. Malesuada fames ac turpis egestas. Cursus in hac habitasse platea dictumst quisque sagittis. Sit amet aliquam id diam maecenas ultricies mi eget mauris.\n\nEnim sit amet venenatis urna cursus eget nunc. Fermentum odio eu feugiat pretium nibh ipsum consequat. Eu scelerisque felis imperdiet proin. Nullam non nisi est sit amet facilisis magna etiam tempor. In mollis nunc sed id semper risus in hendrerit. Sollicitudin nibh sit amet commodo nulla facilisi nullam. Sit amet nisl purus in mollis nunc sed id. Nam libero justo laoreet sit amet cursus sit amet dictum. Condimentum id venenatis a condimentum vitae sapien pellentesque. Porta nibh venenatis cras sed felis. Lectus nulla at volutpat diam ut venenatis tellus in. Aliquam etiam erat velit scelerisque in dictum non consectetur a. Leo vel fringilla est ullamcorper eget. Sodales ut etiam sit amet nisl purus in mollis nunc. Euismod nisi porta lorem mollis aliquam. Ornare arcu odio ut sem nulla. Sed felis eget velit aliquet sagittis id consectetur. Pellentesque nec nam aliquam sem et tortor consequat id. Enim nec dui nunc mattis enim ut tellus elementum.\n\nNullam non nisi est sit amet facilisis magna. Rutrum quisque non tellus orci ac auctor augue. Nunc vel risus commodo viverra maecenas accumsan lacus. Viverra vitae congue eu consequat. Sollicitudin nibh sit amet commodo nulla. Amet volutpat consequat mauris nunc congue nisi. Maecenas pharetra convallis posuere morbi leo urna molestie at. Mattis vulputate enim nulla aliquet porttitor lacus luctus accumsan tortor. Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc consequat. Adipiscing diam donec adipiscing tristique risus. Elementum curabitur vitae nunc sed velit dignissim sodales ut. Eleifend donec pretium vulputate sapien nec. Commodo quis imperdiet massa tincidunt nunc pulvinar. Proin libero nunc consequat interdum varius sit amet mattis. Facilisis gravida neque convallis a cras semper auctor neque vitae. Quisque egestas diam in arcu cursus. Nunc eget lorem dolor sed viverra ipsum. Mauris sit amet massa vitae tortor condimentum lacinia quis vel.\n\nAliquam sem et tortor consequat id porta nibh venenatis cras. Nunc sed id semper risus in. Enim sed faucibus turpis in eu mi bibendum neque. Molestie nunc non blandit massa enim. Enim praesent elementum facilisis leo vel fringilla est ullamcorper. Semper risus in hendrerit gravida rutrum quisque non tellus orci. Ac turpis egestas maecenas pharetra. In nulla posuere sollicitudin aliquam. Justo nec ultrices dui sapien eget mi proin sed libero. In ornare quam viverra orci sagittis eu. Proin nibh nisl condimentum id venenatis. Morbi enim nunc faucibus a pellentesque sit amet porttitor eget. Quis risus sed vulputate odio ut enim blandit. Risus feugiat in ante metus dictum at tempor commodo. Sodales neque sodales ut etiam. Nunc id cursus metus aliquam.\n\nGravida dictum fusce ut placerat orci nulla pellentesque dignissim enim. Augue ut lectus arcu bibendum at. Quis varius quam quisque id diam vel quam. Egestas congue quisque egestas diam in arcu. Condimentum mattis pellentesque id nibh tortor id aliquet lectus. Enim lobortis scelerisque fermentum dui faucibus in. In tellus integer feugiat scelerisque varius morbi enim nunc. Mattis molestie a iaculis at erat pellentesque. Elit scelerisque mauris pellentesque pulvinar pellentesque habitant morbi tristique. Lorem ipsum dolor sit amet consectetur adipiscing elit ut aliquam. Nisl rhoncus mattis rhoncus urna neque. Ac auctor augue mauris augue neque gravida in fermentum et. Sodales ut eu sem integer vitae justo eget. Sed egestas egestas fringilla phasellus.\n\nViverra adipiscing at in tellus integer feugiat scelerisque varius. Purus gravida quis blandit turpis. Id porta nibh venenatis cras sed. Mattis vulputate enim nulla aliquet porttitor lacus. Augue eget arcu dictum varius duis at consectetur lorem donec. Nulla at volutpat diam ut venenatis tellus in metus. Aliquam etiam erat velit scelerisque in dictum non consectetur. Turpis cursus in hac habitasse platea dictumst. Consequat mauris nunc congue nisi vitae suscipit tellus. Volutpat maecenas volutpat blandit aliquam etiam. Massa massa ultricies mi quis hendrerit dolor magna eget est. Velit egestas dui id ornare arcu. Non consectetur a erat nam at. Orci sagittis eu volutpat odio facilisis mauris sit amet. Dui id ornare arcu odio. Sed arcu non odio euismod lacinia.\n\nFeugiat in ante metus dictum. Gravida arcu ac tortor dignissim convallis. Egestas sed tempus urna et pharetra pharetra massa massa. Nulla facilisi nullam vehicula ipsum a arcu. Ipsum a arcu cursus vitae congue mauris. Porttitor rhoncus dolor purus non. Magna sit amet purus gravida quis blandit. Sapien eget mi proin sed libero enim sed faucibus turpis. Nisl nunc mi ipsum faucibus vitae aliquet nec ullamcorper sit. Pellentesque dignissim enim sit amet venenatis urna cursus eget. Pharetra massa massa ultricies mi quis hendrerit. Sapien nec sagittis aliquam malesuada bibendum. Nunc scelerisque viverra mauris in aliquam sem fringilla ut. Dolor magna eget est lorem ipsum dolor. Amet commodo nulla facilisi nullam. Pellentesque elit ullamcorper dignissim cras. Id porta nibh venenatis cras sed felis eget. Nam at lectus urna duis.\n\nLaoreet non curabitur gravida arcu ac tortor dignissim convallis. Nunc lobortis mattis aliquam faucibus purus in massa tempor. Sit amet luctus venenatis lectus magna fringilla. Duis ultricies lacus sed turpis tincidunt id. Sed velit dignissim sodales ut eu. Ut tortor pretium viverra suspendisse potenti nullam. Iaculis at erat pellentesque adipiscing. Ipsum nunc aliquet bibendum enim facilisis gravida neque. Nulla aliquet enim tortor at auctor urna nunc id cursus. Amet cursus sit amet dictum sit amet justo donec enim.\n\nEnim nunc faucibus a pellentesque sit amet porttitor eget dolor. Pharetra magna ac placerat vestibulum lectus mauris ultrices eros in. Nulla facilisi etiam dignissim diam quis enim. Ut enim blandit volutpat maecenas volutpat blandit aliquam etiam erat. Imperdiet proin fermentum leo vel orci porta non pulvinar neque. Vel fringilla est ullamcorper eget nulla. Bibendum neque egestas congue quisque egestas diam in arcu cursus. Ipsum nunc aliquet bibendum enim facilisis gravida neque convallis a. Arcu cursus vitae congue mauris rhoncus aenean vel elit. Augue eget arcu dictum varius duis. Tristique et egestas quis ipsum. Quis varius quam quisque id. Varius sit amet mattis vulputate. Mattis molestie a iaculis at erat pellentesque. Libero justo laoreet sit amet cursus. Aliquam id diam maecenas ultricies mi eget mauris pharetra. Ut eu sem integer vitae justo eget. Fames ac turpis egestas sed. Suspendisse in est ante in nibh mauris cursus mattis.\n\nFaucibus pulvinar elementum integer enim neque volutpat ac tincidunt vitae. Neque vitae tempus quam pellentesque nec nam aliquam. Lobortis elementum nibh tellus molestie nunc non. Lacus vel facilisis volutpat est velit egestas dui. Justo laoreet sit amet cursus sit amet dictum sit amet. Adipiscing enim eu turpis egestas pretium aenean pharetra magna. Cursus metus aliquam eleifend mi in nulla posuere. Nibh mauris cursus mattis molestie a. Dignissim diam quis enim lobortis scelerisque fermentum. A scelerisque purus semper eget duis at tellus. Lacus sed turpis tincidunt id aliquet risus feugiat in. Non tellus orci ac auctor. Ultrices in iaculis nunc sed augue lacus. Tincidunt tortor aliquam nulla facilisi cras.\n\nNulla facilisi nullam vehicula ipsum a arcu cursus vitae congue. Eget magna fermentum iaculis eu non diam phasellus. Pharetra massa massa ultricies mi quis. Eget mauris pharetra et ultrices neque ornare. Aliquam faucibus purus in massa. Facilisi morbi tempus iaculis urna id volutpat lacus. Accumsan lacus vel facilisis volutpat. Curabitur gravida arcu ac tortor. Quam lacus suspendisse faucibus interdum. Elementum nibh tellus molestie nunc non blandit massa enim. Libero id faucibus nisl tincidunt. Bibendum ut tristique et egestas. Ut diam quam nulla porttitor massa id neque aliquam vestibulum. Augue interdum velit euismod in pellentesque. Adipiscing diam donec adipiscing tristique risus nec feugiat. Fringilla ut morbi tincidunt augue interdum velit. Vitae et leo duis ut diam quam nulla porttitor massa.\n\nEgestas integer eget aliquet nibh praesent tristique. Posuere sollicitudin aliquam ultrices sagittis orci a. Nisi est sit amet facilisis. Risus quis varius quam quisque id diam. Faucibus turpis in eu mi. Et molestie ac feugiat sed lectus vestibulum. Porttitor lacus luctus accumsan tortor posuere ac. Platea dictumst vestibulum rhoncus est pellentesque. Tortor pretium viverra suspendisse potenti nullam ac tortor. Enim praesent elementum facilisis leo vel fringilla est. Proin libero nunc consequat interdum varius sit amet mattis vulputate. Turpis egestas pretium aenean pharetra magna ac placerat vestibulum lectus. Nulla pharetra diam sit amet nisl suscipit. Mauris nunc congue nisi vitae suscipit tellus mauris a diam. Faucibus in ornare quam viverra orci sagittis eu volutpat. Volutpat consequat mauris nunc congue nisi vitae. Dui nunc mattis enim ut tellus. Adipiscing elit ut aliquam purus sit amet luctus.\n\nTempus egestas sed sed risus. Scelerisque fermentum dui faucibus in ornare quam viverra orci. Massa ultricies mi quis hendrerit dolor magna eget. Pulvinar mattis nunc sed blandit libero volutpat sed cras ornare. Ut eu sem integer vitae justo eget magna fermentum. Ornare quam viverra orci sagittis. Eget dolor morbi non arcu risus quis varius quam. Tincidunt praesent semper feugiat nibh sed pulvinar. Sit amet justo donec enim diam vulputate. Dui faucibus in ornare quam viverra. Tincidunt tortor aliquam nulla facilisi cras fermentum odio eu. Turpis egestas sed tempus urna et. Pretium quam vulputate dignissim suspendisse in est ante in.\n\nMorbi quis commodo odio aenean sed adipiscing diam donec. Nunc mattis enim ut tellus elementum sagittis vitae et. Diam vel quam elementum pulvinar etiam non quam. Convallis posuere morbi leo urna molestie at elementum eu. Adipiscing at in tellus integer feugiat scelerisque varius morbi. Quis varius quam quisque id diam vel quam elementum. Dui accumsan sit amet nulla. Adipiscing elit duis tristique sollicitudin nibh sit amet commodo. Viverra ipsum nunc aliquet bibendum enim facilisis. Porta lorem mollis aliquam ut. Velit ut tortor pretium viverra suspendisse potenti. Quis viverra nibh cras pulvinar mattis nunc sed blandit. Pharetra magna ac placerat vestibulum. Mauris ultrices eros in cursus turpis massa.\n\nLacus vestibulum sed arcu non odio euismod lacinia at. Dapibus ultrices in iaculis nunc sed. Cras adipiscing enim eu turpis egestas. Eget arcu dictum varius duis at consectetur. Consequat id porta nibh venenatis cras sed felis eget velit. Integer enim neque volutpat ac tincidunt vitae. Feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Ut morbi tincidunt augue interdum velit euismod. Sed cras ornare arcu dui vivamus arcu felis bibendum ut. Eget felis eget nunc lobortis mattis aliquam faucibus purus in. Luctus venenatis lectus magna fringilla urna porttitor rhoncus dolor. Nisl nunc mi ipsum faucibus vitae. Proin fermentum leo vel orci porta. Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Et leo duis ut diam quam. Eros in cursus turpis massa tincidunt. Volutpat est velit egestas dui id. Commodo odio aenean sed adipiscing diam. Quis blandit turpis cursus in hac habitasse platea dictumst quisque. Magna fringilla urna porttitor rhoncus dolor.\n\nAmet consectetur adipiscing elit ut aliquam purus sit amet. Vitae justo eget magna fermentum iaculis eu non diam. Hendrerit dolor magna eget est. Ac placerat vestibulum lectus mauris ultrices eros in cursus turpis. Egestas diam in arcu cursus. At varius vel pharetra vel turpis nunc. Lacus vel facilisis volutpat est velit. Ut ornare lectus sit amet est placerat in egestas. Quam adipiscing vitae proin sagittis nisl rhoncus. Dolor purus non enim praesent. Urna condimentum mattis pellentesque id. Magnis dis parturient montes nascetur ridiculus. Feugiat nisl pretium fusce id. Sed cras ornare arcu dui vivamus. Vitae turpis massa sed elementum tempus egestas sed sed. Ac feugiat sed lectus vestibulum mattis ullamcorper velit sed ullamcorper. Ac ut consequat semper viverra nam libero. Consectetur lorem donec massa sapien faucibus. Purus viverra accumsan in nisl nisi scelerisque eu ultrices.\n\nEu turpis egestas pretium aenean pharetra. Nisl rhoncus mattis rhoncus urna neque viverra justo nec ultrices. Pellentesque sit amet porttitor eget dolor morbi non arcu. Vitae justo eget magna fermentum iaculis. Quis auctor elit sed vulputate mi sit. Purus viverra accumsan in nisl nisi scelerisque eu ultrices. Semper auctor neque vitae tempus quam pellentesque nec nam. Rhoncus dolor purus non enim. Sed turpis tincidunt id aliquet risus feugiat. Sit amet justo donec enim diam vulputate ut pharetra sit. Risus pretium quam vulputate dignissim suspendisse in est ante in. Massa sapien faucibus et molestie ac feugiat. Id aliquet risus feugiat in ante metus. Risus ultricies tristique nulla aliquet enim tortor at auctor urna. Sed lectus vestibulum mattis ullamcorper velit sed ullamcorper morbi.\n\nLacus sed turpis tincidunt id aliquet risus feugiat in. Risus ultricies tristique nulla aliquet enim tortor. In ornare quam viverra orci sagittis eu volutpat. Netus et malesuada fames ac turpis egestas sed tempus urna. Fames ac turpis egestas maecenas pharetra convallis posuere morbi. Etiam erat velit scelerisque in dictum non. Cursus turpis massa tincidunt dui ut ornare lectus. Tristique sollicitudin nibh sit amet commodo nulla facilisi. Pellentesque pulvinar pellentesque habitant morbi tristique senectus et. Aliquet eget sit amet tellus cras. Nullam ac tortor vitae purus faucibus ornare. Lacus viverra vitae congue eu consequat. Vulputate ut pharetra sit amet. Est ante in nibh mauris cursus mattis molestie a. Ipsum suspendisse ultrices gravida dictum fusce ut placerat orci.\n\nEt tortor at risus viverra. Sed libero enim sed faucibus turpis in eu. Id cursus metus aliquam eleifend mi in nulla posuere sollicitudin. Risus viverra adipiscing at in. Imperdiet massa tincidunt nunc pulvinar sapien et. Nec feugiat in fermentum posuere urna nec tincidunt. Ultricies mi eget mauris pharetra et. Morbi tristique senectus et netus et malesuada fames ac. At quis risus sed vulputate. Interdum velit laoreet id donec. Sapien pellentesque habitant morbi tristique. Pharetra vel turpis nunc eget lorem dolor sed viverra. In massa tempor nec feugiat nisl. Massa tincidunt nunc pulvinar sapien et ligula ullamcorper malesuada proin. Mauris augue neque gravida in.\n\nFaucibus vitae aliquet nec ullamcorper sit amet risus. Id velit ut tortor pretium viverra suspendisse potenti. Leo integer malesuada nunc vel risus commodo viverra maecenas. Risus quis varius quam quisque id. Aliquam malesuada bibendum arcu vitae elementum curabitur vitae. Vestibulum lectus mauris ultrices eros in cursus turpis. Fermentum posuere urna nec tincidunt. Magna etiam tempor orci eu lobortis elementum nibh tellus molestie. Id ornare arcu odio ut. Facilisi nullam vehicula ipsum a arcu cursus vitae congue. Nulla pellentesque dignissim enim sit amet venenatis urna cursus eget. Viverra mauris in aliquam sem fringilla ut morbi tincidunt. Quis ipsum suspendisse ultrices gravida dictum fusce ut placerat orci. Sed cras ornare arcu dui vivamus arcu felis. Egestas diam in arcu cursus euismod quis.\n\nTincidunt dui ut ornare lectus. Morbi tristique senectus et netus et. Ornare arcu dui vivamus arcu felis bibendum ut tristique. Habitant morbi tristique senectus et netus et malesuada fames ac. Ut tristique et egestas quis. Mollis aliquam ut porttitor leo. Venenatis tellus in metus vulputate eu scelerisque felis imperdiet proin. Sagittis eu volutpat odio facilisis mauris sit amet massa. Eu facilisis sed odio morbi. Nunc consequat interdum varius sit amet mattis. Velit dignissim sodales ut eu. Pellentesque eu tincidunt tortor aliquam. Porta lorem mollis aliquam ut porttitor. Rhoncus urna neque viverra justo nec ultrices. Viverra suspendisse potenti nullam ac tortor vitae purus. Fermentum posuere urna nec tincidunt praesent semper feugiat nibh sed. Purus sit amet luctus venenatis lectus magna fringilla urna porttitor. Sed lectus vestibulum mattis ullamcorper velit sed ullamcorper. Nulla posuere sollicitudin aliquam ultrices sagittis orci a scelerisque. Nisl nisi scelerisque eu ultrices vitae auctor.\n\nIn vitae turpis massa sed elementum tempus egestas. Cursus sit amet dictum sit amet justo donec enim. Vitae congue eu consequat ac felis donec et. Augue interdum velit euismod in pellentesque massa placerat. Enim ut sem viverra aliquet eget sit amet. Velit scelerisque in dictum non consectetur a erat. Sed lectus vestibulum mattis ullamcorper velit sed ullamcorper. Nunc faucibus a pellentesque sit amet porttitor eget. Tellus integer feugiat scelerisque varius morbi. Lorem sed risus ultricies tristique nulla aliquet enim tortor at. Eget nulla facilisi etiam dignissim diam quis enim lobortis scelerisque. Adipiscing elit duis tristique sollicitudin. Adipiscing elit pellentesque habitant morbi tristique. Ac tincidunt vitae semper quis lectus nulla at.\n\nMaecenas sed enim ut sem viverra. Erat pellentesque adipiscing commodo elit at imperdiet. Dolor morbi non arcu risus quis varius quam quisque. Fringilla urna porttitor rhoncus dolor purus non enim praesent. Tellus integer feugiat scelerisque varius morbi enim nunc faucibus a. Felis eget nunc lobortis mattis aliquam faucibus purus in. Fringilla phasellus faucibus scelerisque eleifend. Pulvinar etiam non quam lacus suspendisse faucibus interdum posuere. Risus ultricies tristique nulla aliquet. Lectus sit amet est placerat. Ac ut consequat semper viverra nam libero justo. Dapibus ultrices in iaculis nunc sed augue. Mattis ullamcorper velit sed ullamcorper. Eget nullam non nisi est. Vitae elementum curabitur vitae nunc sed velit.\n\nSit amet commodo nulla facilisi nullam vehicula ipsum a arcu. Tempor nec feugiat nisl pretium fusce id velit ut. Nulla pellentesque dignissim enim sit amet venenatis. Sed tempus urna et pharetra pharetra. Congue quisque egestas diam in. Convallis posuere morbi leo urna. Nec tincidunt praesent semper feugiat nibh sed pulvinar proin gravida. Sagittis nisl rhoncus mattis rhoncus urna neque viverra justo. Scelerisque felis imperdiet proin fermentum leo vel. Ut placerat orci nulla pellentesque dignissim enim sit amet. In cursus turpis massa tincidunt dui. Rutrum quisque non tellus orci ac auctor augue mauris augue. Cursus vitae congue mauris rhoncus aenean vel elit scelerisque mauris.\n\nScelerisque fermentum dui faucibus in ornare quam viverra orci. Habitant morbi tristique senectus et netus et. Ridiculus mus mauris vitae ultricies leo. Vitae semper quis lectus nulla at volutpat diam. Purus faucibus ornare suspendisse sed nisi. Enim lobortis scelerisque fermentum dui faucibus in ornare quam. Mi tempus imperdiet nulla malesuada pellentesque elit eget. Varius duis at consectetur lorem donec. Pulvinar pellentesque habitant morbi tristique senectus et netus et. A iaculis at erat pellentesque adipiscing commodo elit at imperdiet.\n\nMi ipsum faucibus vitae aliquet nec. Libero volutpat sed cras ornare arcu dui vivamus arcu. Natoque penatibus et magnis dis parturient montes nascetur ridiculus. Maecenas volutpat blandit aliquam etiam erat velit scelerisque. Cras adipiscing enim eu turpis. Nec tincidunt praesent semper feugiat nibh sed pulvinar. Justo laoreet sit amet cursus sit amet dictum sit. Velit scelerisque in dictum non consectetur a erat nam. Turpis tincidunt id aliquet risus feugiat in ante. Aliquet risus feugiat in ante metus dictum. Hac habitasse platea dictumst quisque sagittis purus sit. Et pharetra pharetra massa massa ultricies. Sit amet nisl suscipit adipiscing bibendum est ultricies integer. Venenatis urna cursus eget nunc scelerisque viverra mauris in. Integer quis auctor elit sed. In est ante in nibh mauris cursus mattis molestie. Scelerisque in dictum non consectetur a erat nam at.\n\nLectus sit amet est placerat in. Sit amet cursus sit amet. Nibh nisl condimentum id venenatis a condimentum. Purus ut faucibus pulvinar elementum integer enim. Pharetra sit amet aliquam id diam maecenas. Id cursus metus aliquam eleifend mi in nulla posuere. Lobortis mattis aliquam faucibus purus in massa tempor nec. Urna neque viverra justo nec ultrices dui sapien eget. Enim ut sem viverra aliquet eget sit amet. In eu mi bibendum neque egestas congue quisque egestas. Enim neque volutpat ac tincidunt. Orci ac auctor augue mauris augue neque gravida in fermentum. Velit aliquet sagittis id consectetur. Enim ut sem viverra aliquet eget sit amet tellus.\n\nSemper auctor neque vitae tempus quam pellentesque nec. Non blandit massa enim nec dui nunc. Morbi blandit cursus risus at ultrices mi tempus imperdiet nulla. Arcu non odio euismod lacinia at quis risus. Dictum varius duis at consectetur lorem donec massa. Blandit massa enim nec dui. Nibh ipsum consequat nisl vel. Turpis in eu mi bibendum neque. Ut tristique et egestas quis. Ac odio tempor orci dapibus. Gravida dictum fusce ut placerat orci nulla pellentesque dignissim. Integer feugiat scelerisque varius morbi enim. Libero volutpat sed cras ornare arcu dui. Odio aenean sed adipiscing diam. Et egestas quis ipsum suspendisse ultrices. Aliquet lectus proin nibh nisl condimentum. Sit amet consectetur adipiscing elit duis tristique sollicitudin nibh sit. Blandit massa enim nec dui. Tellus molestie nunc non blandit massa enim nec. Tortor vitae purus faucibus ornare suspendisse sed nisi.\n\nNascetur ridiculus mus mauris vitae ultricies leo. Elementum facilisis leo vel fringilla est ullamcorper eget nulla. Diam maecenas ultricies mi eget. Duis tristique sollicitudin nibh sit amet commodo nulla. Tempus iaculis urna id volutpat lacus laoreet non curabitur gravida. Dictumst quisque sagittis purus sit amet. Viverra mauris in aliquam sem. Quis risus sed vulputate odio ut enim blandit volutpat maecenas. Condimentum mattis pellentesque id nibh tortor id. Non sodales neque sodales ut etiam sit amet. Ipsum consequat nisl vel pretium. Cursus in hac habitasse platea dictumst quisque sagittis purus sit. Fringilla est ullamcorper eget nulla facilisi etiam. Tellus elementum sagittis vitae et leo duis ut diam quam. Nisl vel pretium lectus quam id leo in."}}
diff --git a/tests/data/valid/toml-lang-compliance/valid/qa/qa-scalar-literal-multiline-40kb.toml b/tests/data/valid/toml-lang-compliance/valid/qa/qa-scalar-literal-multiline-40kb.toml
new file mode 100644
index 0000000..ef89c23
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/qa/qa-scalar-literal-multiline-40kb.toml
@@ -0,0 +1,99 @@
+long = """Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Quam lacus suspendisse faucibus interdum posuere lorem ipsum dolor. Amet consectetur adipiscing elit ut. Nulla facilisi etiam dignissim diam quis enim lobortis. Curabitur vitae nunc sed velit dignissim sodales ut eu. Fames ac turpis egestas sed tempus urna et. Facilisi cras fermentum odio eu feugiat pretium. Nec tincidunt praesent semper feugiat nibh sed pulvinar proin gravida. Est lorem ipsum dolor sit amet consectetur adipiscing elit. Vel quam elementum pulvinar etiam non quam lacus. Pharetra et ultrices neque ornare aenean euismod. Nisl nisi scelerisque eu ultrices. Eget dolor morbi non arcu risus. Bibendum neque egestas congue quisque egestas diam in arcu cursus. Faucibus nisl tincidunt eget nullam. Nisl pretium fusce id velit ut tortor pretium viverra suspendisse. Mauris ultrices eros in cursus. Donec ac odio tempor orci dapibus ultrices in iaculis. Tellus cras adipiscing enim eu turpis egestas pretium aenean pharetra.
+
+Eros in cursus turpis massa. Nascetur ridiculus mus mauris vitae ultricies leo integer malesuada nunc. Velit sed ullamcorper morbi tincidunt ornare massa eget egestas purus. Aenean euismod elementum nisi quis eleifend quam. Magnis dis parturient montes nascetur ridiculus mus. Eu tincidunt tortor aliquam nulla facilisi cras. Tristique senectus et netus et malesuada fames. Urna nec tincidunt praesent semper feugiat nibh sed pulvinar. Vitae ultricies leo integer malesuada nunc vel risus commodo viverra. Ac turpis egestas sed tempus urna et. Amet mauris commodo quis imperdiet massa tincidunt. Urna nunc id cursus metus aliquam eleifend mi. In nulla posuere sollicitudin aliquam ultrices sagittis orci a scelerisque. Neque aliquam vestibulum morbi blandit cursus. Pulvinar mattis nunc sed blandit libero volutpat sed. Sed egestas egestas fringilla phasellus faucibus scelerisque eleifend donec pretium.
+
+Blandit cursus risus at ultrices mi tempus. Turpis massa sed elementum tempus egestas sed sed. Dictum varius duis at consectetur lorem. Commodo ullamcorper a lacus vestibulum sed arcu non. Dolor magna eget est lorem. Tincidunt arcu non sodales neque sodales ut etiam sit amet. Sit amet risus nullam eget felis eget nunc lobortis. Risus in hendrerit gravida rutrum quisque non tellus orci. Elementum pulvinar etiam non quam lacus suspendisse faucibus. Morbi tristique senectus et netus et malesuada. In aliquam sem fringilla ut morbi tincidunt. Ornare aenean euismod elementum nisi quis eleifend quam. Sed id semper risus in hendrerit gravida rutrum quisque. Lorem ipsum dolor sit amet consectetur adipiscing elit. A condimentum vitae sapien pellentesque habitant morbi tristique senectus et. Faucibus purus in massa tempor nec feugiat nisl. Vehicula ipsum a arcu cursus vitae congue. Facilisi cras fermentum odio eu feugiat pretium nibh. Viverra mauris in aliquam sem fringilla ut morbi tincidunt. Ultrices dui sapien eget mi proin sed libero enim.
+
+Nisi est sit amet facilisis magna etiam tempor. Posuere ac ut consequat semper viverra nam. Dis parturient montes nascetur ridiculus mus mauris vitae. Nec sagittis aliquam malesuada bibendum. Mattis pellentesque id nibh tortor id aliquet lectus. Vitae congue eu consequat ac felis donec et. Cras sed felis eget velit aliquet sagittis id consectetur purus. Pellentesque elit ullamcorper dignissim cras tincidunt. Pellentesque dignissim enim sit amet venenatis urna. A cras semper auctor neque vitae tempus. Amet massa vitae tortor condimentum lacinia quis vel eros donec. Tempor commodo ullamcorper a lacus. Nibh tellus molestie nunc non blandit massa enim nec dui. Viverra orci sagittis eu volutpat odio facilisis mauris sit. Sed augue lacus viverra vitae. Vulputate eu scelerisque felis imperdiet proin fermentum leo vel orci. Tellus rutrum tellus pellentesque eu tincidunt tortor.
+
+Cras semper auctor neque vitae tempus quam pellentesque nec. Lorem ipsum dolor sit amet consectetur adipiscing elit ut aliquam. Tristique magna sit amet purus gravida quis blandit turpis. Viverra ipsum nunc aliquet bibendum. Arcu bibendum at varius vel. Amet mattis vulputate enim nulla. Vulputate enim nulla aliquet porttitor. Volutpat blandit aliquam etiam erat velit scelerisque in dictum. Morbi tristique senectus et netus et malesuada fames ac. Faucibus et molestie ac feugiat sed.
+
+Tellus elementum sagittis vitae et leo duis. Id aliquet lectus proin nibh. Ornare arcu dui vivamus arcu. Morbi tincidunt augue interdum velit euismod in pellentesque massa placerat. Quis eleifend quam adipiscing vitae. Tristique senectus et netus et malesuada fames ac turpis. Pharetra convallis posuere morbi leo. Ornare arcu odio ut sem nulla pharetra diam sit. Morbi tristique senectus et netus et. Dictum non consectetur a erat nam at lectus urna.
+
+Varius vel pharetra vel turpis. Mi ipsum faucibus vitae aliquet. Tellus in metus vulputate eu scelerisque felis imperdiet proin. In est ante in nibh mauris cursus mattis. Massa ultricies mi quis hendrerit dolor magna eget. Fermentum leo vel orci porta. Elit ut aliquam purus sit amet luctus venenatis lectus. Eget aliquet nibh praesent tristique magna sit amet. Arcu non odio euismod lacinia at quis. Montes nascetur ridiculus mus mauris vitae ultricies. Tempus quam pellentesque nec nam aliquam sem et tortor. Morbi leo urna molestie at elementum eu facilisis sed.
+
+In fermentum posuere urna nec tincidunt. Neque aliquam vestibulum morbi blandit cursus risus. Vulputate dignissim suspendisse in est ante in nibh mauris cursus. Lorem ipsum dolor sit amet consectetur adipiscing. Orci eu lobortis elementum nibh tellus molestie nunc non. Enim diam vulputate ut pharetra sit amet aliquam. Convallis convallis tellus id interdum velit laoreet id donec ultrices. Sit amet mattis vulputate enim nulla aliquet porttitor lacus luctus. A lacus vestibulum sed arcu non odio. Ut tortor pretium viverra suspendisse potenti nullam ac tortor. Diam vel quam elementum pulvinar etiam non quam. Viverra justo nec ultrices dui. Eu volutpat odio facilisis mauris sit amet massa. Sed ullamcorper morbi tincidunt ornare massa eget egestas purus. Ac felis donec et odio pellentesque. Nisl vel pretium lectus quam id leo in. Ultricies lacus sed turpis tincidunt id.
+
+At urna condimentum mattis pellentesque id nibh tortor id. Sem nulla pharetra diam sit amet nisl suscipit. Neque viverra justo nec ultrices. Arcu cursus euismod quis viverra nibh cras pulvinar. Dolor sit amet consectetur adipiscing elit ut aliquam purus. Id diam vel quam elementum pulvinar etiam non. Elementum pulvinar etiam non quam lacus suspendisse faucibus. Id aliquet lectus proin nibh nisl condimentum id venenatis. Sit amet consectetur adipiscing elit duis tristique sollicitudin nibh. Sed faucibus turpis in eu mi bibendum neque egestas congue. Consectetur libero id faucibus nisl tincidunt eget nullam. At volutpat diam ut venenatis tellus in metus vulputate eu. Condimentum lacinia quis vel eros donec ac odio. Sit amet porttitor eget dolor morbi non arcu risus quis. Viverra mauris in aliquam sem fringilla ut morbi tincidunt. Metus dictum at tempor commodo ullamcorper. At ultrices mi tempus imperdiet nulla. Est ullamcorper eget nulla facilisi etiam dignissim diam quis. Lobortis elementum nibh tellus molestie nunc non. Placerat in egestas erat imperdiet sed.
+
+Placerat in egestas erat imperdiet sed euismod. Lobortis feugiat vivamus at augue eget arcu dictum varius. Ut sem nulla pharetra diam sit amet. Et tortor at risus viverra adipiscing at in. Tempor nec feugiat nisl pretium. Cursus euismod quis viverra nibh. Eget mi proin sed libero enim sed. Aliquam id diam maecenas ultricies. Mi tempus imperdiet nulla malesuada pellentesque elit eget. Gravida quis blandit turpis cursus in hac habitasse platea dictumst. Sed tempus urna et pharetra pharetra massa massa. Dolor purus non enim praesent elementum facilisis leo vel.
+
+Pharetra vel turpis nunc eget. Quam pellentesque nec nam aliquam sem et tortor consequat id. Orci eu lobortis elementum nibh tellus molestie nunc non. Porttitor leo a diam sollicitudin tempor id. Tincidunt ornare massa eget egestas purus viverra accumsan in nisl. Quam lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Elit ut aliquam purus sit amet luctus venenatis lectus. Velit egestas dui id ornare arcu odio ut sem nulla. Lacus viverra vitae congue eu consequat ac felis donec. Nulla aliquet porttitor lacus luctus accumsan tortor posuere ac ut. Lorem dolor sed viverra ipsum. Blandit libero volutpat sed cras ornare arcu. Egestas erat imperdiet sed euismod nisi porta lorem mollis. Viverra maecenas accumsan lacus vel. Enim neque volutpat ac tincidunt. Porttitor massa id neque aliquam vestibulum morbi blandit cursus risus. Malesuada bibendum arcu vitae elementum curabitur vitae nunc.
+
+Et malesuada fames ac turpis egestas integer. Egestas egestas fringilla phasellus faucibus scelerisque eleifend donec pretium. Est placerat in egestas erat imperdiet sed. Non arcu risus quis varius quam quisque. Lorem mollis aliquam ut porttitor leo a. Viverra tellus in hac habitasse platea dictumst vestibulum rhoncus. Fermentum iaculis eu non diam. Erat imperdiet sed euismod nisi porta lorem mollis aliquam. Varius vel pharetra vel turpis nunc eget lorem dolor. Rhoncus mattis rhoncus urna neque viverra. Hac habitasse platea dictumst quisque sagittis purus sit. At quis risus sed vulputate odio ut enim. Pharetra magna ac placerat vestibulum lectus mauris ultrices eros. Rutrum quisque non tellus orci ac auctor. Iaculis eu non diam phasellus vestibulum lorem sed. Ut sem nulla pharetra diam sit amet nisl suscipit. Risus at ultrices mi tempus. Vitae tortor condimentum lacinia quis vel eros donec. Sed tempus urna et pharetra. Posuere sollicitudin aliquam ultrices sagittis orci.
+
+Congue quisque egestas diam in arcu. Hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Pellentesque habitant morbi tristique senectus et netus et. Id interdum velit laoreet id. Fusce ut placerat orci nulla pellentesque dignissim. Pretium nibh ipsum consequat nisl vel pretium. Etiam erat velit scelerisque in dictum non consectetur a. Turpis in eu mi bibendum neque egestas congue quisque egestas. Pulvinar sapien et ligula ullamcorper malesuada. Ultricies tristique nulla aliquet enim tortor at. Suspendisse interdum consectetur libero id faucibus. Lorem sed risus ultricies tristique nulla aliquet. Tristique senectus et netus et malesuada fames. Eu augue ut lectus arcu bibendum at varius vel. Egestas sed tempus urna et pharetra pharetra massa massa ultricies. Aliquet eget sit amet tellus cras adipiscing. Massa placerat duis ultricies lacus sed turpis tincidunt id aliquet. Ornare massa eget egestas purus viverra accumsan in nisl. Justo laoreet sit amet cursus sit amet.
+
+In metus vulputate eu scelerisque felis imperdiet proin. At erat pellentesque adipiscing commodo elit at. Ipsum suspendisse ultrices gravida dictum fusce. Lectus sit amet est placerat in egestas erat. Aliquam ultrices sagittis orci a. Sagittis id consectetur purus ut faucibus pulvinar elementum. Ornare arcu odio ut sem nulla pharetra diam. Sit amet purus gravida quis blandit turpis cursus. Duis ultricies lacus sed turpis tincidunt. Malesuada fames ac turpis egestas sed tempus urna et. Viverra ipsum nunc aliquet bibendum enim facilisis. Et pharetra pharetra massa massa ultricies mi quis. Eget duis at tellus at urna condimentum mattis. Euismod in pellentesque massa placerat. Enim nunc faucibus a pellentesque sit amet porttitor. Dolor sed viverra ipsum nunc aliquet. Donec enim diam vulputate ut pharetra sit amet. Feugiat sed lectus vestibulum mattis ullamcorper velit sed. Erat pellentesque adipiscing commodo elit at imperdiet. Nisl purus in mollis nunc sed id semper risus.
+
+Tincidunt augue interdum velit euismod in pellentesque massa. Facilisis magna etiam tempor orci. Mauris in aliquam sem fringilla ut. Gravida dictum fusce ut placerat orci. Sed risus ultricies tristique nulla. Odio morbi quis commodo odio. Feugiat in ante metus dictum at tempor commodo ullamcorper. Porta non pulvinar neque laoreet suspendisse interdum. Etiam tempor orci eu lobortis elementum. Fusce ut placerat orci nulla pellentesque dignissim. Ornare lectus sit amet est placerat in egestas erat. Quis vel eros donec ac. Elementum pulvinar etiam non quam lacus. Sit amet tellus cras adipiscing enim eu turpis. Amet tellus cras adipiscing enim eu. Sed faucibus turpis in eu mi bibendum. Lectus proin nibh nisl condimentum id.
+
+Sollicitudin nibh sit amet commodo nulla. Sed tempus urna et pharetra pharetra massa massa. Magna eget est lorem ipsum. Elit ullamcorper dignissim cras tincidunt lobortis feugiat vivamus at. Fermentum dui faucibus in ornare quam viverra orci sagittis eu. Dignissim convallis aenean et tortor. Ut faucibus pulvinar elementum integer enim neque. Nibh cras pulvinar mattis nunc sed. Pellentesque sit amet porttitor eget dolor morbi. Mi eget mauris pharetra et ultrices neque ornare aenean euismod. Quis risus sed vulputate odio ut enim blandit volutpat. Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. In vitae turpis massa sed elementum tempus egestas sed sed. Urna id volutpat lacus laoreet non. Egestas pretium aenean pharetra magna ac placerat. Amet commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Donec et odio pellentesque diam volutpat commodo sed. Etiam non quam lacus suspendisse.
+
+Augue neque gravida in fermentum et sollicitudin ac orci. Eu feugiat pretium nibh ipsum. Nam at lectus urna duis convallis convallis tellus id. Egestas integer eget aliquet nibh. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae auctor. Urna condimentum mattis pellentesque id nibh tortor id. In egestas erat imperdiet sed euismod. Ut sem viverra aliquet eget sit amet tellus. Feugiat pretium nibh ipsum consequat nisl vel pretium. Volutpat odio facilisis mauris sit amet.
+
+Mi sit amet mauris commodo quis imperdiet massa tincidunt. Neque volutpat ac tincidunt vitae semper quis lectus nulla at. Nec feugiat in fermentum posuere urna nec. Ut venenatis tellus in metus vulputate eu. Vestibulum rhoncus est pellentesque elit ullamcorper dignissim. Eu scelerisque felis imperdiet proin. Vitae et leo duis ut diam quam nulla. Ut venenatis tellus in metus vulputate eu scelerisque. Tincidunt dui ut ornare lectus sit amet. Adipiscing diam donec adipiscing tristique risus. Turpis nunc eget lorem dolor sed viverra ipsum nunc aliquet. Non sodales neque sodales ut. Massa placerat duis ultricies lacus sed turpis tincidunt. Viverra orci sagittis eu volutpat odio facilisis mauris sit amet.
+
+Adipiscing vitae proin sagittis nisl. Vitae aliquet nec ullamcorper sit. Potenti nullam ac tortor vitae purus. Ultricies lacus sed turpis tincidunt id. Ut diam quam nulla porttitor massa id neque aliquam vestibulum. Semper eget duis at tellus at urna condimentum mattis pellentesque. Nec tincidunt praesent semper feugiat nibh sed pulvinar proin. Dictum fusce ut placerat orci nulla pellentesque dignissim. Amet luctus venenatis lectus magna fringilla urna. Quam quisque id diam vel quam elementum pulvinar. At tempor commodo ullamcorper a. Magna etiam tempor orci eu lobortis. Suspendisse ultrices gravida dictum fusce. Massa ultricies mi quis hendrerit dolor magna.
+
+Massa tincidunt nunc pulvinar sapien et ligula ullamcorper malesuada proin. Aliquet enim tortor at auctor urna nunc id. Semper feugiat nibh sed pulvinar proin gravida. Porttitor rhoncus dolor purus non enim. Metus aliquam eleifend mi in nulla. Lectus arcu bibendum at varius vel pharetra. Sed vulputate odio ut enim blandit volutpat. Et ligula ullamcorper malesuada proin libero nunc consequat interdum varius. Donec et odio pellentesque diam volutpat commodo. Id ornare arcu odio ut sem nulla pharetra diam sit.
+
+Est ullamcorper eget nulla facilisi etiam dignissim diam quis enim. Sagittis vitae et leo duis ut diam quam nulla. Elementum nisi quis eleifend quam. Congue mauris rhoncus aenean vel elit. Adipiscing elit duis tristique sollicitudin nibh sit. Egestas egestas fringilla phasellus faucibus scelerisque. Morbi tincidunt augue interdum velit euismod. Massa sed elementum tempus egestas sed sed. Id leo in vitae turpis massa sed elementum tempus egestas. In pellentesque massa placerat duis ultricies lacus sed turpis. Vitae proin sagittis nisl rhoncus mattis rhoncus. Enim tortor at auctor urna nunc id. In fermentum posuere urna nec tincidunt praesent semper feugiat nibh. Aliquam ut porttitor leo a diam sollicitudin tempor id. Pellentesque elit eget gravida cum sociis natoque. Molestie at elementum eu facilisis sed odio morbi quis. Tristique senectus et netus et malesuada fames ac turpis. Proin libero nunc consequat interdum varius sit amet mattis. Pellentesque id nibh tortor id.
+
+Risus sed vulputate odio ut enim blandit. Laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt eget. Morbi tincidunt augue interdum velit euismod in pellentesque. Pharetra pharetra massa massa ultricies mi quis hendrerit. Nunc aliquet bibendum enim facilisis gravida neque. Feugiat sed lectus vestibulum mattis ullamcorper velit sed ullamcorper. Risus quis varius quam quisque id diam vel. Et ultrices neque ornare aenean. Aliquet sagittis id consectetur purus ut faucibus pulvinar elementum. Nibh ipsum consequat nisl vel. Mauris rhoncus aenean vel elit scelerisque mauris pellentesque pulvinar. Ornare quam viverra orci sagittis eu volutpat odio facilisis. Euismod nisi porta lorem mollis aliquam. Enim ut tellus elementum sagittis. Rhoncus mattis rhoncus urna neque. Malesuada fames ac turpis egestas. Cursus in hac habitasse platea dictumst quisque sagittis. Sit amet aliquam id diam maecenas ultricies mi eget mauris.
+
+Enim sit amet venenatis urna cursus eget nunc. Fermentum odio eu feugiat pretium nibh ipsum consequat. Eu scelerisque felis imperdiet proin. Nullam non nisi est sit amet facilisis magna etiam tempor. In mollis nunc sed id semper risus in hendrerit. Sollicitudin nibh sit amet commodo nulla facilisi nullam. Sit amet nisl purus in mollis nunc sed id. Nam libero justo laoreet sit amet cursus sit amet dictum. Condimentum id venenatis a condimentum vitae sapien pellentesque. Porta nibh venenatis cras sed felis. Lectus nulla at volutpat diam ut venenatis tellus in. Aliquam etiam erat velit scelerisque in dictum non consectetur a. Leo vel fringilla est ullamcorper eget. Sodales ut etiam sit amet nisl purus in mollis nunc. Euismod nisi porta lorem mollis aliquam. Ornare arcu odio ut sem nulla. Sed felis eget velit aliquet sagittis id consectetur. Pellentesque nec nam aliquam sem et tortor consequat id. Enim nec dui nunc mattis enim ut tellus elementum.
+
+Nullam non nisi est sit amet facilisis magna. Rutrum quisque non tellus orci ac auctor augue. Nunc vel risus commodo viverra maecenas accumsan lacus. Viverra vitae congue eu consequat. Sollicitudin nibh sit amet commodo nulla. Amet volutpat consequat mauris nunc congue nisi. Maecenas pharetra convallis posuere morbi leo urna molestie at. Mattis vulputate enim nulla aliquet porttitor lacus luctus accumsan tortor. Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc consequat. Adipiscing diam donec adipiscing tristique risus. Elementum curabitur vitae nunc sed velit dignissim sodales ut. Eleifend donec pretium vulputate sapien nec. Commodo quis imperdiet massa tincidunt nunc pulvinar. Proin libero nunc consequat interdum varius sit amet mattis. Facilisis gravida neque convallis a cras semper auctor neque vitae. Quisque egestas diam in arcu cursus. Nunc eget lorem dolor sed viverra ipsum. Mauris sit amet massa vitae tortor condimentum lacinia quis vel.
+
+Aliquam sem et tortor consequat id porta nibh venenatis cras. Nunc sed id semper risus in. Enim sed faucibus turpis in eu mi bibendum neque. Molestie nunc non blandit massa enim. Enim praesent elementum facilisis leo vel fringilla est ullamcorper. Semper risus in hendrerit gravida rutrum quisque non tellus orci. Ac turpis egestas maecenas pharetra. In nulla posuere sollicitudin aliquam. Justo nec ultrices dui sapien eget mi proin sed libero. In ornare quam viverra orci sagittis eu. Proin nibh nisl condimentum id venenatis. Morbi enim nunc faucibus a pellentesque sit amet porttitor eget. Quis risus sed vulputate odio ut enim blandit. Risus feugiat in ante metus dictum at tempor commodo. Sodales neque sodales ut etiam. Nunc id cursus metus aliquam.
+
+Gravida dictum fusce ut placerat orci nulla pellentesque dignissim enim. Augue ut lectus arcu bibendum at. Quis varius quam quisque id diam vel quam. Egestas congue quisque egestas diam in arcu. Condimentum mattis pellentesque id nibh tortor id aliquet lectus. Enim lobortis scelerisque fermentum dui faucibus in. In tellus integer feugiat scelerisque varius morbi enim nunc. Mattis molestie a iaculis at erat pellentesque. Elit scelerisque mauris pellentesque pulvinar pellentesque habitant morbi tristique. Lorem ipsum dolor sit amet consectetur adipiscing elit ut aliquam. Nisl rhoncus mattis rhoncus urna neque. Ac auctor augue mauris augue neque gravida in fermentum et. Sodales ut eu sem integer vitae justo eget. Sed egestas egestas fringilla phasellus.
+
+Viverra adipiscing at in tellus integer feugiat scelerisque varius. Purus gravida quis blandit turpis. Id porta nibh venenatis cras sed. Mattis vulputate enim nulla aliquet porttitor lacus. Augue eget arcu dictum varius duis at consectetur lorem donec. Nulla at volutpat diam ut venenatis tellus in metus. Aliquam etiam erat velit scelerisque in dictum non consectetur. Turpis cursus in hac habitasse platea dictumst. Consequat mauris nunc congue nisi vitae suscipit tellus. Volutpat maecenas volutpat blandit aliquam etiam. Massa massa ultricies mi quis hendrerit dolor magna eget est. Velit egestas dui id ornare arcu. Non consectetur a erat nam at. Orci sagittis eu volutpat odio facilisis mauris sit amet. Dui id ornare arcu odio. Sed arcu non odio euismod lacinia.
+
+Feugiat in ante metus dictum. Gravida arcu ac tortor dignissim convallis. Egestas sed tempus urna et pharetra pharetra massa massa. Nulla facilisi nullam vehicula ipsum a arcu. Ipsum a arcu cursus vitae congue mauris. Porttitor rhoncus dolor purus non. Magna sit amet purus gravida quis blandit. Sapien eget mi proin sed libero enim sed faucibus turpis. Nisl nunc mi ipsum faucibus vitae aliquet nec ullamcorper sit. Pellentesque dignissim enim sit amet venenatis urna cursus eget. Pharetra massa massa ultricies mi quis hendrerit. Sapien nec sagittis aliquam malesuada bibendum. Nunc scelerisque viverra mauris in aliquam sem fringilla ut. Dolor magna eget est lorem ipsum dolor. Amet commodo nulla facilisi nullam. Pellentesque elit ullamcorper dignissim cras. Id porta nibh venenatis cras sed felis eget. Nam at lectus urna duis.
+
+Laoreet non curabitur gravida arcu ac tortor dignissim convallis. Nunc lobortis mattis aliquam faucibus purus in massa tempor. Sit amet luctus venenatis lectus magna fringilla. Duis ultricies lacus sed turpis tincidunt id. Sed velit dignissim sodales ut eu. Ut tortor pretium viverra suspendisse potenti nullam. Iaculis at erat pellentesque adipiscing. Ipsum nunc aliquet bibendum enim facilisis gravida neque. Nulla aliquet enim tortor at auctor urna nunc id cursus. Amet cursus sit amet dictum sit amet justo donec enim.
+
+Enim nunc faucibus a pellentesque sit amet porttitor eget dolor. Pharetra magna ac placerat vestibulum lectus mauris ultrices eros in. Nulla facilisi etiam dignissim diam quis enim. Ut enim blandit volutpat maecenas volutpat blandit aliquam etiam erat. Imperdiet proin fermentum leo vel orci porta non pulvinar neque. Vel fringilla est ullamcorper eget nulla. Bibendum neque egestas congue quisque egestas diam in arcu cursus. Ipsum nunc aliquet bibendum enim facilisis gravida neque convallis a. Arcu cursus vitae congue mauris rhoncus aenean vel elit. Augue eget arcu dictum varius duis. Tristique et egestas quis ipsum. Quis varius quam quisque id. Varius sit amet mattis vulputate. Mattis molestie a iaculis at erat pellentesque. Libero justo laoreet sit amet cursus. Aliquam id diam maecenas ultricies mi eget mauris pharetra. Ut eu sem integer vitae justo eget. Fames ac turpis egestas sed. Suspendisse in est ante in nibh mauris cursus mattis.
+
+Faucibus pulvinar elementum integer enim neque volutpat ac tincidunt vitae. Neque vitae tempus quam pellentesque nec nam aliquam. Lobortis elementum nibh tellus molestie nunc non. Lacus vel facilisis volutpat est velit egestas dui. Justo laoreet sit amet cursus sit amet dictum sit amet. Adipiscing enim eu turpis egestas pretium aenean pharetra magna. Cursus metus aliquam eleifend mi in nulla posuere. Nibh mauris cursus mattis molestie a. Dignissim diam quis enim lobortis scelerisque fermentum. A scelerisque purus semper eget duis at tellus. Lacus sed turpis tincidunt id aliquet risus feugiat in. Non tellus orci ac auctor. Ultrices in iaculis nunc sed augue lacus. Tincidunt tortor aliquam nulla facilisi cras.
+
+Nulla facilisi nullam vehicula ipsum a arcu cursus vitae congue. Eget magna fermentum iaculis eu non diam phasellus. Pharetra massa massa ultricies mi quis. Eget mauris pharetra et ultrices neque ornare. Aliquam faucibus purus in massa. Facilisi morbi tempus iaculis urna id volutpat lacus. Accumsan lacus vel facilisis volutpat. Curabitur gravida arcu ac tortor. Quam lacus suspendisse faucibus interdum. Elementum nibh tellus molestie nunc non blandit massa enim. Libero id faucibus nisl tincidunt. Bibendum ut tristique et egestas. Ut diam quam nulla porttitor massa id neque aliquam vestibulum. Augue interdum velit euismod in pellentesque. Adipiscing diam donec adipiscing tristique risus nec feugiat. Fringilla ut morbi tincidunt augue interdum velit. Vitae et leo duis ut diam quam nulla porttitor massa.
+
+Egestas integer eget aliquet nibh praesent tristique. Posuere sollicitudin aliquam ultrices sagittis orci a. Nisi est sit amet facilisis. Risus quis varius quam quisque id diam. Faucibus turpis in eu mi. Et molestie ac feugiat sed lectus vestibulum. Porttitor lacus luctus accumsan tortor posuere ac. Platea dictumst vestibulum rhoncus est pellentesque. Tortor pretium viverra suspendisse potenti nullam ac tortor. Enim praesent elementum facilisis leo vel fringilla est. Proin libero nunc consequat interdum varius sit amet mattis vulputate. Turpis egestas pretium aenean pharetra magna ac placerat vestibulum lectus. Nulla pharetra diam sit amet nisl suscipit. Mauris nunc congue nisi vitae suscipit tellus mauris a diam. Faucibus in ornare quam viverra orci sagittis eu volutpat. Volutpat consequat mauris nunc congue nisi vitae. Dui nunc mattis enim ut tellus. Adipiscing elit ut aliquam purus sit amet luctus.
+
+Tempus egestas sed sed risus. Scelerisque fermentum dui faucibus in ornare quam viverra orci. Massa ultricies mi quis hendrerit dolor magna eget. Pulvinar mattis nunc sed blandit libero volutpat sed cras ornare. Ut eu sem integer vitae justo eget magna fermentum. Ornare quam viverra orci sagittis. Eget dolor morbi non arcu risus quis varius quam. Tincidunt praesent semper feugiat nibh sed pulvinar. Sit amet justo donec enim diam vulputate. Dui faucibus in ornare quam viverra. Tincidunt tortor aliquam nulla facilisi cras fermentum odio eu. Turpis egestas sed tempus urna et. Pretium quam vulputate dignissim suspendisse in est ante in.
+
+Morbi quis commodo odio aenean sed adipiscing diam donec. Nunc mattis enim ut tellus elementum sagittis vitae et. Diam vel quam elementum pulvinar etiam non quam. Convallis posuere morbi leo urna molestie at elementum eu. Adipiscing at in tellus integer feugiat scelerisque varius morbi. Quis varius quam quisque id diam vel quam elementum. Dui accumsan sit amet nulla. Adipiscing elit duis tristique sollicitudin nibh sit amet commodo. Viverra ipsum nunc aliquet bibendum enim facilisis. Porta lorem mollis aliquam ut. Velit ut tortor pretium viverra suspendisse potenti. Quis viverra nibh cras pulvinar mattis nunc sed blandit. Pharetra magna ac placerat vestibulum. Mauris ultrices eros in cursus turpis massa.
+
+Lacus vestibulum sed arcu non odio euismod lacinia at. Dapibus ultrices in iaculis nunc sed. Cras adipiscing enim eu turpis egestas. Eget arcu dictum varius duis at consectetur. Consequat id porta nibh venenatis cras sed felis eget velit. Integer enim neque volutpat ac tincidunt vitae. Feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Ut morbi tincidunt augue interdum velit euismod. Sed cras ornare arcu dui vivamus arcu felis bibendum ut. Eget felis eget nunc lobortis mattis aliquam faucibus purus in. Luctus venenatis lectus magna fringilla urna porttitor rhoncus dolor. Nisl nunc mi ipsum faucibus vitae. Proin fermentum leo vel orci porta. Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Et leo duis ut diam quam. Eros in cursus turpis massa tincidunt. Volutpat est velit egestas dui id. Commodo odio aenean sed adipiscing diam. Quis blandit turpis cursus in hac habitasse platea dictumst quisque. Magna fringilla urna porttitor rhoncus dolor.
+
+Amet consectetur adipiscing elit ut aliquam purus sit amet. Vitae justo eget magna fermentum iaculis eu non diam. Hendrerit dolor magna eget est. Ac placerat vestibulum lectus mauris ultrices eros in cursus turpis. Egestas diam in arcu cursus. At varius vel pharetra vel turpis nunc. Lacus vel facilisis volutpat est velit. Ut ornare lectus sit amet est placerat in egestas. Quam adipiscing vitae proin sagittis nisl rhoncus. Dolor purus non enim praesent. Urna condimentum mattis pellentesque id. Magnis dis parturient montes nascetur ridiculus. Feugiat nisl pretium fusce id. Sed cras ornare arcu dui vivamus. Vitae turpis massa sed elementum tempus egestas sed sed. Ac feugiat sed lectus vestibulum mattis ullamcorper velit sed ullamcorper. Ac ut consequat semper viverra nam libero. Consectetur lorem donec massa sapien faucibus. Purus viverra accumsan in nisl nisi scelerisque eu ultrices.
+
+Eu turpis egestas pretium aenean pharetra. Nisl rhoncus mattis rhoncus urna neque viverra justo nec ultrices. Pellentesque sit amet porttitor eget dolor morbi non arcu. Vitae justo eget magna fermentum iaculis. Quis auctor elit sed vulputate mi sit. Purus viverra accumsan in nisl nisi scelerisque eu ultrices. Semper auctor neque vitae tempus quam pellentesque nec nam. Rhoncus dolor purus non enim. Sed turpis tincidunt id aliquet risus feugiat. Sit amet justo donec enim diam vulputate ut pharetra sit. Risus pretium quam vulputate dignissim suspendisse in est ante in. Massa sapien faucibus et molestie ac feugiat. Id aliquet risus feugiat in ante metus. Risus ultricies tristique nulla aliquet enim tortor at auctor urna. Sed lectus vestibulum mattis ullamcorper velit sed ullamcorper morbi.
+
+Lacus sed turpis tincidunt id aliquet risus feugiat in. Risus ultricies tristique nulla aliquet enim tortor. In ornare quam viverra orci sagittis eu volutpat. Netus et malesuada fames ac turpis egestas sed tempus urna. Fames ac turpis egestas maecenas pharetra convallis posuere morbi. Etiam erat velit scelerisque in dictum non. Cursus turpis massa tincidunt dui ut ornare lectus. Tristique sollicitudin nibh sit amet commodo nulla facilisi. Pellentesque pulvinar pellentesque habitant morbi tristique senectus et. Aliquet eget sit amet tellus cras. Nullam ac tortor vitae purus faucibus ornare. Lacus viverra vitae congue eu consequat. Vulputate ut pharetra sit amet. Est ante in nibh mauris cursus mattis molestie a. Ipsum suspendisse ultrices gravida dictum fusce ut placerat orci.
+
+Et tortor at risus viverra. Sed libero enim sed faucibus turpis in eu. Id cursus metus aliquam eleifend mi in nulla posuere sollicitudin. Risus viverra adipiscing at in. Imperdiet massa tincidunt nunc pulvinar sapien et. Nec feugiat in fermentum posuere urna nec tincidunt. Ultricies mi eget mauris pharetra et. Morbi tristique senectus et netus et malesuada fames ac. At quis risus sed vulputate. Interdum velit laoreet id donec. Sapien pellentesque habitant morbi tristique. Pharetra vel turpis nunc eget lorem dolor sed viverra. In massa tempor nec feugiat nisl. Massa tincidunt nunc pulvinar sapien et ligula ullamcorper malesuada proin. Mauris augue neque gravida in.
+
+Faucibus vitae aliquet nec ullamcorper sit amet risus. Id velit ut tortor pretium viverra suspendisse potenti. Leo integer malesuada nunc vel risus commodo viverra maecenas. Risus quis varius quam quisque id. Aliquam malesuada bibendum arcu vitae elementum curabitur vitae. Vestibulum lectus mauris ultrices eros in cursus turpis. Fermentum posuere urna nec tincidunt. Magna etiam tempor orci eu lobortis elementum nibh tellus molestie. Id ornare arcu odio ut. Facilisi nullam vehicula ipsum a arcu cursus vitae congue. Nulla pellentesque dignissim enim sit amet venenatis urna cursus eget. Viverra mauris in aliquam sem fringilla ut morbi tincidunt. Quis ipsum suspendisse ultrices gravida dictum fusce ut placerat orci. Sed cras ornare arcu dui vivamus arcu felis. Egestas diam in arcu cursus euismod quis.
+
+Tincidunt dui ut ornare lectus. Morbi tristique senectus et netus et. Ornare arcu dui vivamus arcu felis bibendum ut tristique. Habitant morbi tristique senectus et netus et malesuada fames ac. Ut tristique et egestas quis. Mollis aliquam ut porttitor leo. Venenatis tellus in metus vulputate eu scelerisque felis imperdiet proin. Sagittis eu volutpat odio facilisis mauris sit amet massa. Eu facilisis sed odio morbi. Nunc consequat interdum varius sit amet mattis. Velit dignissim sodales ut eu. Pellentesque eu tincidunt tortor aliquam. Porta lorem mollis aliquam ut porttitor. Rhoncus urna neque viverra justo nec ultrices. Viverra suspendisse potenti nullam ac tortor vitae purus. Fermentum posuere urna nec tincidunt praesent semper feugiat nibh sed. Purus sit amet luctus venenatis lectus magna fringilla urna porttitor. Sed lectus vestibulum mattis ullamcorper velit sed ullamcorper. Nulla posuere sollicitudin aliquam ultrices sagittis orci a scelerisque. Nisl nisi scelerisque eu ultrices vitae auctor.
+
+In vitae turpis massa sed elementum tempus egestas. Cursus sit amet dictum sit amet justo donec enim. Vitae congue eu consequat ac felis donec et. Augue interdum velit euismod in pellentesque massa placerat. Enim ut sem viverra aliquet eget sit amet. Velit scelerisque in dictum non consectetur a erat. Sed lectus vestibulum mattis ullamcorper velit sed ullamcorper. Nunc faucibus a pellentesque sit amet porttitor eget. Tellus integer feugiat scelerisque varius morbi. Lorem sed risus ultricies tristique nulla aliquet enim tortor at. Eget nulla facilisi etiam dignissim diam quis enim lobortis scelerisque. Adipiscing elit duis tristique sollicitudin. Adipiscing elit pellentesque habitant morbi tristique. Ac tincidunt vitae semper quis lectus nulla at.
+
+Maecenas sed enim ut sem viverra. Erat pellentesque adipiscing commodo elit at imperdiet. Dolor morbi non arcu risus quis varius quam quisque. Fringilla urna porttitor rhoncus dolor purus non enim praesent. Tellus integer feugiat scelerisque varius morbi enim nunc faucibus a. Felis eget nunc lobortis mattis aliquam faucibus purus in. Fringilla phasellus faucibus scelerisque eleifend. Pulvinar etiam non quam lacus suspendisse faucibus interdum posuere. Risus ultricies tristique nulla aliquet. Lectus sit amet est placerat. Ac ut consequat semper viverra nam libero justo. Dapibus ultrices in iaculis nunc sed augue. Mattis ullamcorper velit sed ullamcorper. Eget nullam non nisi est. Vitae elementum curabitur vitae nunc sed velit.
+
+Sit amet commodo nulla facilisi nullam vehicula ipsum a arcu. Tempor nec feugiat nisl pretium fusce id velit ut. Nulla pellentesque dignissim enim sit amet venenatis. Sed tempus urna et pharetra pharetra. Congue quisque egestas diam in. Convallis posuere morbi leo urna. Nec tincidunt praesent semper feugiat nibh sed pulvinar proin gravida. Sagittis nisl rhoncus mattis rhoncus urna neque viverra justo. Scelerisque felis imperdiet proin fermentum leo vel. Ut placerat orci nulla pellentesque dignissim enim sit amet. In cursus turpis massa tincidunt dui. Rutrum quisque non tellus orci ac auctor augue mauris augue. Cursus vitae congue mauris rhoncus aenean vel elit scelerisque mauris.
+
+Scelerisque fermentum dui faucibus in ornare quam viverra orci. Habitant morbi tristique senectus et netus et. Ridiculus mus mauris vitae ultricies leo. Vitae semper quis lectus nulla at volutpat diam. Purus faucibus ornare suspendisse sed nisi. Enim lobortis scelerisque fermentum dui faucibus in ornare quam. Mi tempus imperdiet nulla malesuada pellentesque elit eget. Varius duis at consectetur lorem donec. Pulvinar pellentesque habitant morbi tristique senectus et netus et. A iaculis at erat pellentesque adipiscing commodo elit at imperdiet.
+
+Mi ipsum faucibus vitae aliquet nec. Libero volutpat sed cras ornare arcu dui vivamus arcu. Natoque penatibus et magnis dis parturient montes nascetur ridiculus. Maecenas volutpat blandit aliquam etiam erat velit scelerisque. Cras adipiscing enim eu turpis. Nec tincidunt praesent semper feugiat nibh sed pulvinar. Justo laoreet sit amet cursus sit amet dictum sit. Velit scelerisque in dictum non consectetur a erat nam. Turpis tincidunt id aliquet risus feugiat in ante. Aliquet risus feugiat in ante metus dictum. Hac habitasse platea dictumst quisque sagittis purus sit. Et pharetra pharetra massa massa ultricies. Sit amet nisl suscipit adipiscing bibendum est ultricies integer. Venenatis urna cursus eget nunc scelerisque viverra mauris in. Integer quis auctor elit sed. In est ante in nibh mauris cursus mattis molestie. Scelerisque in dictum non consectetur a erat nam at.
+
+Lectus sit amet est placerat in. Sit amet cursus sit amet. Nibh nisl condimentum id venenatis a condimentum. Purus ut faucibus pulvinar elementum integer enim. Pharetra sit amet aliquam id diam maecenas. Id cursus metus aliquam eleifend mi in nulla posuere. Lobortis mattis aliquam faucibus purus in massa tempor nec. Urna neque viverra justo nec ultrices dui sapien eget. Enim ut sem viverra aliquet eget sit amet. In eu mi bibendum neque egestas congue quisque egestas. Enim neque volutpat ac tincidunt. Orci ac auctor augue mauris augue neque gravida in fermentum. Velit aliquet sagittis id consectetur. Enim ut sem viverra aliquet eget sit amet tellus.
+
+Semper auctor neque vitae tempus quam pellentesque nec. Non blandit massa enim nec dui nunc. Morbi blandit cursus risus at ultrices mi tempus imperdiet nulla. Arcu non odio euismod lacinia at quis risus. Dictum varius duis at consectetur lorem donec massa. Blandit massa enim nec dui. Nibh ipsum consequat nisl vel. Turpis in eu mi bibendum neque. Ut tristique et egestas quis. Ac odio tempor orci dapibus. Gravida dictum fusce ut placerat orci nulla pellentesque dignissim. Integer feugiat scelerisque varius morbi enim. Libero volutpat sed cras ornare arcu dui. Odio aenean sed adipiscing diam. Et egestas quis ipsum suspendisse ultrices. Aliquet lectus proin nibh nisl condimentum. Sit amet consectetur adipiscing elit duis tristique sollicitudin nibh sit. Blandit massa enim nec dui. Tellus molestie nunc non blandit massa enim nec. Tortor vitae purus faucibus ornare suspendisse sed nisi.
+
+Nascetur ridiculus mus mauris vitae ultricies leo. Elementum facilisis leo vel fringilla est ullamcorper eget nulla. Diam maecenas ultricies mi eget. Duis tristique sollicitudin nibh sit amet commodo nulla. Tempus iaculis urna id volutpat lacus laoreet non curabitur gravida. Dictumst quisque sagittis purus sit amet. Viverra mauris in aliquam sem. Quis risus sed vulputate odio ut enim blandit volutpat maecenas. Condimentum mattis pellentesque id nibh tortor id. Non sodales neque sodales ut etiam sit amet. Ipsum consequat nisl vel pretium. Cursus in hac habitasse platea dictumst quisque sagittis purus sit. Fringilla est ullamcorper eget nulla facilisi etiam. Tellus elementum sagittis vitae et leo duis ut diam quam. Nisl vel pretium lectus quam id leo in."""
diff --git a/tests/data/valid/toml-lang-compliance/valid/qa/qa-scalar-string-40kb.json b/tests/data/valid/toml-lang-compliance/valid/qa/qa-scalar-string-40kb.json
new file mode 100644
index 0000000..5b1d643
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/qa/qa-scalar-string-40kb.json
@@ -0,0 +1,2 @@
+{"long":
+ {"type":"string","value":"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Quam lacus suspendisse faucibus interdum posuere lorem ipsum dolor. Amet consectetur adipiscing elit ut. Nulla facilisi etiam dignissim diam quis enim lobortis. Curabitur vitae nunc sed velit dignissim sodales ut eu. Fames ac turpis egestas sed tempus urna et. Facilisi cras fermentum odio eu feugiat pretium. Nec tincidunt praesent semper feugiat nibh sed pulvinar proin gravida. Est lorem ipsum dolor sit amet consectetur adipiscing elit. Vel quam elementum pulvinar etiam non quam lacus. Pharetra et ultrices neque ornare aenean euismod. Nisl nisi scelerisque eu ultrices. Eget dolor morbi non arcu risus. Bibendum neque egestas congue quisque egestas diam in arcu cursus. Faucibus nisl tincidunt eget nullam. Nisl pretium fusce id velit ut tortor pretium viverra suspendisse. Mauris ultrices eros in cursus. Donec ac odio tempor orci dapibus ultrices in iaculis. Tellus cras adipiscing enim eu turpis egestas pretium aenean pharetra. Eros in cursus turpis massa. Nascetur ridiculus mus mauris vitae ultricies leo integer malesuada nunc. Velit sed ullamcorper morbi tincidunt ornare massa eget egestas purus. Aenean euismod elementum nisi quis eleifend quam. Magnis dis parturient montes nascetur ridiculus mus. Eu tincidunt tortor aliquam nulla facilisi cras. Tristique senectus et netus et malesuada fames. Urna nec tincidunt praesent semper feugiat nibh sed pulvinar. Vitae ultricies leo integer malesuada nunc vel risus commodo viverra. Ac turpis egestas sed tempus urna et. Amet mauris commodo quis imperdiet massa tincidunt. Urna nunc id cursus metus aliquam eleifend mi. In nulla posuere sollicitudin aliquam ultrices sagittis orci a scelerisque. Neque aliquam vestibulum morbi blandit cursus. Pulvinar mattis nunc sed blandit libero volutpat sed. Sed egestas egestas fringilla phasellus faucibus scelerisque eleifend donec pretium. Blandit cursus risus at ultrices mi tempus. Turpis massa sed elementum tempus egestas sed sed. Dictum varius duis at consectetur lorem. Commodo ullamcorper a lacus vestibulum sed arcu non. Dolor magna eget est lorem. Tincidunt arcu non sodales neque sodales ut etiam sit amet. Sit amet risus nullam eget felis eget nunc lobortis. Risus in hendrerit gravida rutrum quisque non tellus orci. Elementum pulvinar etiam non quam lacus suspendisse faucibus. Morbi tristique senectus et netus et malesuada. In aliquam sem fringilla ut morbi tincidunt. Ornare aenean euismod elementum nisi quis eleifend quam. Sed id semper risus in hendrerit gravida rutrum quisque. Lorem ipsum dolor sit amet consectetur adipiscing elit. A condimentum vitae sapien pellentesque habitant morbi tristique senectus et. Faucibus purus in massa tempor nec feugiat nisl. Vehicula ipsum a arcu cursus vitae congue. Facilisi cras fermentum odio eu feugiat pretium nibh. Viverra mauris in aliquam sem fringilla ut morbi tincidunt. Ultrices dui sapien eget mi proin sed libero enim. Nisi est sit amet facilisis magna etiam tempor. Posuere ac ut consequat semper viverra nam. Dis parturient montes nascetur ridiculus mus mauris vitae. Nec sagittis aliquam malesuada bibendum. Mattis pellentesque id nibh tortor id aliquet lectus. Vitae congue eu consequat ac felis donec et. Cras sed felis eget velit aliquet sagittis id consectetur purus. Pellentesque elit ullamcorper dignissim cras tincidunt. Pellentesque dignissim enim sit amet venenatis urna. A cras semper auctor neque vitae tempus. Amet massa vitae tortor condimentum lacinia quis vel eros donec. Tempor commodo ullamcorper a lacus. Nibh tellus molestie nunc non blandit massa enim nec dui. Viverra orci sagittis eu volutpat odio facilisis mauris sit. Sed augue lacus viverra vitae. Vulputate eu scelerisque felis imperdiet proin fermentum leo vel orci. Tellus rutrum tellus pellentesque eu tincidunt tortor. Cras semper auctor neque vitae tempus quam pellentesque nec. Lorem ipsum dolor sit amet consectetur adipiscing elit ut aliquam. Tristique magna sit amet purus gravida quis blandit turpis. Viverra ipsum nunc aliquet bibendum. Arcu bibendum at varius vel. Amet mattis vulputate enim nulla. Vulputate enim nulla aliquet porttitor. Volutpat blandit aliquam etiam erat velit scelerisque in dictum. Morbi tristique senectus et netus et malesuada fames ac. Faucibus et molestie ac feugiat sed. Tellus elementum sagittis vitae et leo duis. Id aliquet lectus proin nibh. Ornare arcu dui vivamus arcu. Morbi tincidunt augue interdum velit euismod in pellentesque massa placerat. Quis eleifend quam adipiscing vitae. Tristique senectus et netus et malesuada fames ac turpis. Pharetra convallis posuere morbi leo. Ornare arcu odio ut sem nulla pharetra diam sit. Morbi tristique senectus et netus et. Dictum non consectetur a erat nam at lectus urna. Varius vel pharetra vel turpis. Mi ipsum faucibus vitae aliquet. Tellus in metus vulputate eu scelerisque felis imperdiet proin. In est ante in nibh mauris cursus mattis. Massa ultricies mi quis hendrerit dolor magna eget. Fermentum leo vel orci porta. Elit ut aliquam purus sit amet luctus venenatis lectus. Eget aliquet nibh praesent tristique magna sit amet. Arcu non odio euismod lacinia at quis. Montes nascetur ridiculus mus mauris vitae ultricies. Tempus quam pellentesque nec nam aliquam sem et tortor. Morbi leo urna molestie at elementum eu facilisis sed. In fermentum posuere urna nec tincidunt. Neque aliquam vestibulum morbi blandit cursus risus. Vulputate dignissim suspendisse in est ante in nibh mauris cursus. Lorem ipsum dolor sit amet consectetur adipiscing. Orci eu lobortis elementum nibh tellus molestie nunc non. Enim diam vulputate ut pharetra sit amet aliquam. Convallis convallis tellus id interdum velit laoreet id donec ultrices. Sit amet mattis vulputate enim nulla aliquet porttitor lacus luctus. A lacus vestibulum sed arcu non odio. Ut tortor pretium viverra suspendisse potenti nullam ac tortor. Diam vel quam elementum pulvinar etiam non quam. Viverra justo nec ultrices dui. Eu volutpat odio facilisis mauris sit amet massa. Sed ullamcorper morbi tincidunt ornare massa eget egestas purus. Ac felis donec et odio pellentesque. Nisl vel pretium lectus quam id leo in. Ultricies lacus sed turpis tincidunt id. At urna condimentum mattis pellentesque id nibh tortor id. Sem nulla pharetra diam sit amet nisl suscipit. Neque viverra justo nec ultrices. Arcu cursus euismod quis viverra nibh cras pulvinar. Dolor sit amet consectetur adipiscing elit ut aliquam purus. Id diam vel quam elementum pulvinar etiam non. Elementum pulvinar etiam non quam lacus suspendisse faucibus. Id aliquet lectus proin nibh nisl condimentum id venenatis. Sit amet consectetur adipiscing elit duis tristique sollicitudin nibh. Sed faucibus turpis in eu mi bibendum neque egestas congue. Consectetur libero id faucibus nisl tincidunt eget nullam. At volutpat diam ut venenatis tellus in metus vulputate eu. Condimentum lacinia quis vel eros donec ac odio. Sit amet porttitor eget dolor morbi non arcu risus quis. Viverra mauris in aliquam sem fringilla ut morbi tincidunt. Metus dictum at tempor commodo ullamcorper. At ultrices mi tempus imperdiet nulla. Est ullamcorper eget nulla facilisi etiam dignissim diam quis. Lobortis elementum nibh tellus molestie nunc non. Placerat in egestas erat imperdiet sed. Placerat in egestas erat imperdiet sed euismod. Lobortis feugiat vivamus at augue eget arcu dictum varius. Ut sem nulla pharetra diam sit amet. Et tortor at risus viverra adipiscing at in. Tempor nec feugiat nisl pretium. Cursus euismod quis viverra nibh. Eget mi proin sed libero enim sed. Aliquam id diam maecenas ultricies. Mi tempus imperdiet nulla malesuada pellentesque elit eget. Gravida quis blandit turpis cursus in hac habitasse platea dictumst. Sed tempus urna et pharetra pharetra massa massa. Dolor purus non enim praesent elementum facilisis leo vel. Pharetra vel turpis nunc eget. Quam pellentesque nec nam aliquam sem et tortor consequat id. Orci eu lobortis elementum nibh tellus molestie nunc non. Porttitor leo a diam sollicitudin tempor id. Tincidunt ornare massa eget egestas purus viverra accumsan in nisl. Quam lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Elit ut aliquam purus sit amet luctus venenatis lectus. Velit egestas dui id ornare arcu odio ut sem nulla. Lacus viverra vitae congue eu consequat ac felis donec. Nulla aliquet porttitor lacus luctus accumsan tortor posuere ac ut. Lorem dolor sed viverra ipsum. Blandit libero volutpat sed cras ornare arcu. Egestas erat imperdiet sed euismod nisi porta lorem mollis. Viverra maecenas accumsan lacus vel. Enim neque volutpat ac tincidunt. Porttitor massa id neque aliquam vestibulum morbi blandit cursus risus. Malesuada bibendum arcu vitae elementum curabitur vitae nunc. Et malesuada fames ac turpis egestas integer. Egestas egestas fringilla phasellus faucibus scelerisque eleifend donec pretium. Est placerat in egestas erat imperdiet sed. Non arcu risus quis varius quam quisque. Lorem mollis aliquam ut porttitor leo a. Viverra tellus in hac habitasse platea dictumst vestibulum rhoncus. Fermentum iaculis eu non diam. Erat imperdiet sed euismod nisi porta lorem mollis aliquam. Varius vel pharetra vel turpis nunc eget lorem dolor. Rhoncus mattis rhoncus urna neque viverra. Hac habitasse platea dictumst quisque sagittis purus sit. At quis risus sed vulputate odio ut enim. Pharetra magna ac placerat vestibulum lectus mauris ultrices eros. Rutrum quisque non tellus orci ac auctor. Iaculis eu non diam phasellus vestibulum lorem sed. Ut sem nulla pharetra diam sit amet nisl suscipit. Risus at ultrices mi tempus. Vitae tortor condimentum lacinia quis vel eros donec. Sed tempus urna et pharetra. Posuere sollicitudin aliquam ultrices sagittis orci. Congue quisque egestas diam in arcu. Hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Pellentesque habitant morbi tristique senectus et netus et. Id interdum velit laoreet id. Fusce ut placerat orci nulla pellentesque dignissim. Pretium nibh ipsum consequat nisl vel pretium. Etiam erat velit scelerisque in dictum non consectetur a. Turpis in eu mi bibendum neque egestas congue quisque egestas. Pulvinar sapien et ligula ullamcorper malesuada. Ultricies tristique nulla aliquet enim tortor at. Suspendisse interdum consectetur libero id faucibus. Lorem sed risus ultricies tristique nulla aliquet. Tristique senectus et netus et malesuada fames. Eu augue ut lectus arcu bibendum at varius vel. Egestas sed tempus urna et pharetra pharetra massa massa ultricies. Aliquet eget sit amet tellus cras adipiscing. Massa placerat duis ultricies lacus sed turpis tincidunt id aliquet. Ornare massa eget egestas purus viverra accumsan in nisl. Justo laoreet sit amet cursus sit amet. In metus vulputate eu scelerisque felis imperdiet proin. At erat pellentesque adipiscing commodo elit at. Ipsum suspendisse ultrices gravida dictum fusce. Lectus sit amet est placerat in egestas erat. Aliquam ultrices sagittis orci a. Sagittis id consectetur purus ut faucibus pulvinar elementum. Ornare arcu odio ut sem nulla pharetra diam. Sit amet purus gravida quis blandit turpis cursus. Duis ultricies lacus sed turpis tincidunt. Malesuada fames ac turpis egestas sed tempus urna et. Viverra ipsum nunc aliquet bibendum enim facilisis. Et pharetra pharetra massa massa ultricies mi quis. Eget duis at tellus at urna condimentum mattis. Euismod in pellentesque massa placerat. Enim nunc faucibus a pellentesque sit amet porttitor. Dolor sed viverra ipsum nunc aliquet. Donec enim diam vulputate ut pharetra sit amet. Feugiat sed lectus vestibulum mattis ullamcorper velit sed. Erat pellentesque adipiscing commodo elit at imperdiet. Nisl purus in mollis nunc sed id semper risus. Tincidunt augue interdum velit euismod in pellentesque massa. Facilisis magna etiam tempor orci. Mauris in aliquam sem fringilla ut. Gravida dictum fusce ut placerat orci. Sed risus ultricies tristique nulla. Odio morbi quis commodo odio. Feugiat in ante metus dictum at tempor commodo ullamcorper. Porta non pulvinar neque laoreet suspendisse interdum. Etiam tempor orci eu lobortis elementum. Fusce ut placerat orci nulla pellentesque dignissim. Ornare lectus sit amet est placerat in egestas erat. Quis vel eros donec ac. Elementum pulvinar etiam non quam lacus. Sit amet tellus cras adipiscing enim eu turpis. Amet tellus cras adipiscing enim eu. Sed faucibus turpis in eu mi bibendum. Lectus proin nibh nisl condimentum id. Sollicitudin nibh sit amet commodo nulla. Sed tempus urna et pharetra pharetra massa massa. Magna eget est lorem ipsum. Elit ullamcorper dignissim cras tincidunt lobortis feugiat vivamus at. Fermentum dui faucibus in ornare quam viverra orci sagittis eu. Dignissim convallis aenean et tortor. Ut faucibus pulvinar elementum integer enim neque. Nibh cras pulvinar mattis nunc sed. Pellentesque sit amet porttitor eget dolor morbi. Mi eget mauris pharetra et ultrices neque ornare aenean euismod. Quis risus sed vulputate odio ut enim blandit volutpat. Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. In vitae turpis massa sed elementum tempus egestas sed sed. Urna id volutpat lacus laoreet non. Egestas pretium aenean pharetra magna ac placerat. Amet commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Donec et odio pellentesque diam volutpat commodo sed. Etiam non quam lacus suspendisse. Augue neque gravida in fermentum et sollicitudin ac orci. Eu feugiat pretium nibh ipsum. Nam at lectus urna duis convallis convallis tellus id. Egestas integer eget aliquet nibh. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae auctor. Urna condimentum mattis pellentesque id nibh tortor id. In egestas erat imperdiet sed euismod. Ut sem viverra aliquet eget sit amet tellus. Feugiat pretium nibh ipsum consequat nisl vel pretium. Volutpat odio facilisis mauris sit amet. Mi sit amet mauris commodo quis imperdiet massa tincidunt. Neque volutpat ac tincidunt vitae semper quis lectus nulla at. Nec feugiat in fermentum posuere urna nec. Ut venenatis tellus in metus vulputate eu. Vestibulum rhoncus est pellentesque elit ullamcorper dignissim. Eu scelerisque felis imperdiet proin. Vitae et leo duis ut diam quam nulla. Ut venenatis tellus in metus vulputate eu scelerisque. Tincidunt dui ut ornare lectus sit amet. Adipiscing diam donec adipiscing tristique risus. Turpis nunc eget lorem dolor sed viverra ipsum nunc aliquet. Non sodales neque sodales ut. Massa placerat duis ultricies lacus sed turpis tincidunt. Viverra orci sagittis eu volutpat odio facilisis mauris sit amet. Adipiscing vitae proin sagittis nisl. Vitae aliquet nec ullamcorper sit. Potenti nullam ac tortor vitae purus. Ultricies lacus sed turpis tincidunt id. Ut diam quam nulla porttitor massa id neque aliquam vestibulum. Semper eget duis at tellus at urna condimentum mattis pellentesque. Nec tincidunt praesent semper feugiat nibh sed pulvinar proin. Dictum fusce ut placerat orci nulla pellentesque dignissim. Amet luctus venenatis lectus magna fringilla urna. Quam quisque id diam vel quam elementum pulvinar. At tempor commodo ullamcorper a. Magna etiam tempor orci eu lobortis. Suspendisse ultrices gravida dictum fusce. Massa ultricies mi quis hendrerit dolor magna. Massa tincidunt nunc pulvinar sapien et ligula ullamcorper malesuada proin. Aliquet enim tortor at auctor urna nunc id. Semper feugiat nibh sed pulvinar proin gravida. Porttitor rhoncus dolor purus non enim. Metus aliquam eleifend mi in nulla. Lectus arcu bibendum at varius vel pharetra. Sed vulputate odio ut enim blandit volutpat. Et ligula ullamcorper malesuada proin libero nunc consequat interdum varius. Donec et odio pellentesque diam volutpat commodo. Id ornare arcu odio ut sem nulla pharetra diam sit. Est ullamcorper eget nulla facilisi etiam dignissim diam quis enim. Sagittis vitae et leo duis ut diam quam nulla. Elementum nisi quis eleifend quam. Congue mauris rhoncus aenean vel elit. Adipiscing elit duis tristique sollicitudin nibh sit. Egestas egestas fringilla phasellus faucibus scelerisque. Morbi tincidunt augue interdum velit euismod. Massa sed elementum tempus egestas sed sed. Id leo in vitae turpis massa sed elementum tempus egestas. In pellentesque massa placerat duis ultricies lacus sed turpis. Vitae proin sagittis nisl rhoncus mattis rhoncus. Enim tortor at auctor urna nunc id. In fermentum posuere urna nec tincidunt praesent semper feugiat nibh. Aliquam ut porttitor leo a diam sollicitudin tempor id. Pellentesque elit eget gravida cum sociis natoque. Molestie at elementum eu facilisis sed odio morbi quis. Tristique senectus et netus et malesuada fames ac turpis. Proin libero nunc consequat interdum varius sit amet mattis. Pellentesque id nibh tortor id. Risus sed vulputate odio ut enim blandit. Laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt eget. Morbi tincidunt augue interdum velit euismod in pellentesque. Pharetra pharetra massa massa ultricies mi quis hendrerit. Nunc aliquet bibendum enim facilisis gravida neque. Feugiat sed lectus vestibulum mattis ullamcorper velit sed ullamcorper. Risus quis varius quam quisque id diam vel. Et ultrices neque ornare aenean. Aliquet sagittis id consectetur purus ut faucibus pulvinar elementum. Nibh ipsum consequat nisl vel. Mauris rhoncus aenean vel elit scelerisque mauris pellentesque pulvinar. Ornare quam viverra orci sagittis eu volutpat odio facilisis. Euismod nisi porta lorem mollis aliquam. Enim ut tellus elementum sagittis. Rhoncus mattis rhoncus urna neque. Malesuada fames ac turpis egestas. Cursus in hac habitasse platea dictumst quisque sagittis. Sit amet aliquam id diam maecenas ultricies mi eget mauris. Enim sit amet venenatis urna cursus eget nunc. Fermentum odio eu feugiat pretium nibh ipsum consequat. Eu scelerisque felis imperdiet proin. Nullam non nisi est sit amet facilisis magna etiam tempor. In mollis nunc sed id semper risus in hendrerit. Sollicitudin nibh sit amet commodo nulla facilisi nullam. Sit amet nisl purus in mollis nunc sed id. Nam libero justo laoreet sit amet cursus sit amet dictum. Condimentum id venenatis a condimentum vitae sapien pellentesque. Porta nibh venenatis cras sed felis. Lectus nulla at volutpat diam ut venenatis tellus in. Aliquam etiam erat velit scelerisque in dictum non consectetur a. Leo vel fringilla est ullamcorper eget. Sodales ut etiam sit amet nisl purus in mollis nunc. Euismod nisi porta lorem mollis aliquam. Ornare arcu odio ut sem nulla. Sed felis eget velit aliquet sagittis id consectetur. Pellentesque nec nam aliquam sem et tortor consequat id. Enim nec dui nunc mattis enim ut tellus elementum. Nullam non nisi est sit amet facilisis magna. Rutrum quisque non tellus orci ac auctor augue. Nunc vel risus commodo viverra maecenas accumsan lacus. Viverra vitae congue eu consequat. Sollicitudin nibh sit amet commodo nulla. Amet volutpat consequat mauris nunc congue nisi. Maecenas pharetra convallis posuere morbi leo urna molestie at. Mattis vulputate enim nulla aliquet porttitor lacus luctus accumsan tortor. Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc consequat. Adipiscing diam donec adipiscing tristique risus. Elementum curabitur vitae nunc sed velit dignissim sodales ut. Eleifend donec pretium vulputate sapien nec. Commodo quis imperdiet massa tincidunt nunc pulvinar. Proin libero nunc consequat interdum varius sit amet mattis. Facilisis gravida neque convallis a cras semper auctor neque vitae. Quisque egestas diam in arcu cursus. Nunc eget lorem dolor sed viverra ipsum. Mauris sit amet massa vitae tortor condimentum lacinia quis vel. Aliquam sem et tortor consequat id porta nibh venenatis cras. Nunc sed id semper risus in. Enim sed faucibus turpis in eu mi bibendum neque. Molestie nunc non blandit massa enim. Enim praesent elementum facilisis leo vel fringilla est ullamcorper. Semper risus in hendrerit gravida rutrum quisque non tellus orci. Ac turpis egestas maecenas pharetra. In nulla posuere sollicitudin aliquam. Justo nec ultrices dui sapien eget mi proin sed libero. In ornare quam viverra orci sagittis eu. Proin nibh nisl condimentum id venenatis. Morbi enim nunc faucibus a pellentesque sit amet porttitor eget. Quis risus sed vulputate odio ut enim blandit. Risus feugiat in ante metus dictum at tempor commodo. Sodales neque sodales ut etiam. Nunc id cursus metus aliquam. Gravida dictum fusce ut placerat orci nulla pellentesque dignissim enim. Augue ut lectus arcu bibendum at. Quis varius quam quisque id diam vel quam. Egestas congue quisque egestas diam in arcu. Condimentum mattis pellentesque id nibh tortor id aliquet lectus. Enim lobortis scelerisque fermentum dui faucibus in. In tellus integer feugiat scelerisque varius morbi enim nunc. Mattis molestie a iaculis at erat pellentesque. Elit scelerisque mauris pellentesque pulvinar pellentesque habitant morbi tristique. Lorem ipsum dolor sit amet consectetur adipiscing elit ut aliquam. Nisl rhoncus mattis rhoncus urna neque. Ac auctor augue mauris augue neque gravida in fermentum et. Sodales ut eu sem integer vitae justo eget. Sed egestas egestas fringilla phasellus. Viverra adipiscing at in tellus integer feugiat scelerisque varius. Purus gravida quis blandit turpis. Id porta nibh venenatis cras sed. Mattis vulputate enim nulla aliquet porttitor lacus. Augue eget arcu dictum varius duis at consectetur lorem donec. Nulla at volutpat diam ut venenatis tellus in metus. Aliquam etiam erat velit scelerisque in dictum non consectetur. Turpis cursus in hac habitasse platea dictumst. Consequat mauris nunc congue nisi vitae suscipit tellus. Volutpat maecenas volutpat blandit aliquam etiam. Massa massa ultricies mi quis hendrerit dolor magna eget est. Velit egestas dui id ornare arcu. Non consectetur a erat nam at. Orci sagittis eu volutpat odio facilisis mauris sit amet. Dui id ornare arcu odio. Sed arcu non odio euismod lacinia. Feugiat in ante metus dictum. Gravida arcu ac tortor dignissim convallis. Egestas sed tempus urna et pharetra pharetra massa massa. Nulla facilisi nullam vehicula ipsum a arcu. Ipsum a arcu cursus vitae congue mauris. Porttitor rhoncus dolor purus non. Magna sit amet purus gravida quis blandit. Sapien eget mi proin sed libero enim sed faucibus turpis. Nisl nunc mi ipsum faucibus vitae aliquet nec ullamcorper sit. Pellentesque dignissim enim sit amet venenatis urna cursus eget. Pharetra massa massa ultricies mi quis hendrerit. Sapien nec sagittis aliquam malesuada bibendum. Nunc scelerisque viverra mauris in aliquam sem fringilla ut. Dolor magna eget est lorem ipsum dolor. Amet commodo nulla facilisi nullam. Pellentesque elit ullamcorper dignissim cras. Id porta nibh venenatis cras sed felis eget. Nam at lectus urna duis. Laoreet non curabitur gravida arcu ac tortor dignissim convallis. Nunc lobortis mattis aliquam faucibus purus in massa tempor. Sit amet luctus venenatis lectus magna fringilla. Duis ultricies lacus sed turpis tincidunt id. Sed velit dignissim sodales ut eu. Ut tortor pretium viverra suspendisse potenti nullam. Iaculis at erat pellentesque adipiscing. Ipsum nunc aliquet bibendum enim facilisis gravida neque. Nulla aliquet enim tortor at auctor urna nunc id cursus. Amet cursus sit amet dictum sit amet justo donec enim. Enim nunc faucibus a pellentesque sit amet porttitor eget dolor. Pharetra magna ac placerat vestibulum lectus mauris ultrices eros in. Nulla facilisi etiam dignissim diam quis enim. Ut enim blandit volutpat maecenas volutpat blandit aliquam etiam erat. Imperdiet proin fermentum leo vel orci porta non pulvinar neque. Vel fringilla est ullamcorper eget nulla. Bibendum neque egestas congue quisque egestas diam in arcu cursus. Ipsum nunc aliquet bibendum enim facilisis gravida neque convallis a. Arcu cursus vitae congue mauris rhoncus aenean vel elit. Augue eget arcu dictum varius duis. Tristique et egestas quis ipsum. Quis varius quam quisque id. Varius sit amet mattis vulputate. Mattis molestie a iaculis at erat pellentesque. Libero justo laoreet sit amet cursus. Aliquam id diam maecenas ultricies mi eget mauris pharetra. Ut eu sem integer vitae justo eget. Fames ac turpis egestas sed. Suspendisse in est ante in nibh mauris cursus mattis. Faucibus pulvinar elementum integer enim neque volutpat ac tincidunt vitae. Neque vitae tempus quam pellentesque nec nam aliquam. Lobortis elementum nibh tellus molestie nunc non. Lacus vel facilisis volutpat est velit egestas dui. Justo laoreet sit amet cursus sit amet dictum sit amet. Adipiscing enim eu turpis egestas pretium aenean pharetra magna. Cursus metus aliquam eleifend mi in nulla posuere. Nibh mauris cursus mattis molestie a. Dignissim diam quis enim lobortis scelerisque fermentum. A scelerisque purus semper eget duis at tellus. Lacus sed turpis tincidunt id aliquet risus feugiat in. Non tellus orci ac auctor. Ultrices in iaculis nunc sed augue lacus. Tincidunt tortor aliquam nulla facilisi cras. Nulla facilisi nullam vehicula ipsum a arcu cursus vitae congue. Eget magna fermentum iaculis eu non diam phasellus. Pharetra massa massa ultricies mi quis. Eget mauris pharetra et ultrices neque ornare. Aliquam faucibus purus in massa. Facilisi morbi tempus iaculis urna id volutpat lacus. Accumsan lacus vel facilisis volutpat. Curabitur gravida arcu ac tortor. Quam lacus suspendisse faucibus interdum. Elementum nibh tellus molestie nunc non blandit massa enim. Libero id faucibus nisl tincidunt. Bibendum ut tristique et egestas. Ut diam quam nulla porttitor massa id neque aliquam vestibulum. Augue interdum velit euismod in pellentesque. Adipiscing diam donec adipiscing tristique risus nec feugiat. Fringilla ut morbi tincidunt augue interdum velit. Vitae et leo duis ut diam quam nulla porttitor massa. Egestas integer eget aliquet nibh praesent tristique. Posuere sollicitudin aliquam ultrices sagittis orci a. Nisi est sit amet facilisis. Risus quis varius quam quisque id diam. Faucibus turpis in eu mi. Et molestie ac feugiat sed lectus vestibulum. Porttitor lacus luctus accumsan tortor posuere ac. Platea dictumst vestibulum rhoncus est pellentesque. Tortor pretium viverra suspendisse potenti nullam ac tortor. Enim praesent elementum facilisis leo vel fringilla est. Proin libero nunc consequat interdum varius sit amet mattis vulputate. Turpis egestas pretium aenean pharetra magna ac placerat vestibulum lectus. Nulla pharetra diam sit amet nisl suscipit. Mauris nunc congue nisi vitae suscipit tellus mauris a diam. Faucibus in ornare quam viverra orci sagittis eu volutpat. Volutpat consequat mauris nunc congue nisi vitae. Dui nunc mattis enim ut tellus. Adipiscing elit ut aliquam purus sit amet luctus. Tempus egestas sed sed risus. Scelerisque fermentum dui faucibus in ornare quam viverra orci. Massa ultricies mi quis hendrerit dolor magna eget. Pulvinar mattis nunc sed blandit libero volutpat sed cras ornare. Ut eu sem integer vitae justo eget magna fermentum. Ornare quam viverra orci sagittis. Eget dolor morbi non arcu risus quis varius quam. Tincidunt praesent semper feugiat nibh sed pulvinar. Sit amet justo donec enim diam vulputate. Dui faucibus in ornare quam viverra. Tincidunt tortor aliquam nulla facilisi cras fermentum odio eu. Turpis egestas sed tempus urna et. Pretium quam vulputate dignissim suspendisse in est ante in. Morbi quis commodo odio aenean sed adipiscing diam donec. Nunc mattis enim ut tellus elementum sagittis vitae et. Diam vel quam elementum pulvinar etiam non quam. Convallis posuere morbi leo urna molestie at elementum eu. Adipiscing at in tellus integer feugiat scelerisque varius morbi. Quis varius quam quisque id diam vel quam elementum. Dui accumsan sit amet nulla. Adipiscing elit duis tristique sollicitudin nibh sit amet commodo. Viverra ipsum nunc aliquet bibendum enim facilisis. Porta lorem mollis aliquam ut. Velit ut tortor pretium viverra suspendisse potenti. Quis viverra nibh cras pulvinar mattis nunc sed blandit. Pharetra magna ac placerat vestibulum. Mauris ultrices eros in cursus turpis massa. Lacus vestibulum sed arcu non odio euismod lacinia at. Dapibus ultrices in iaculis nunc sed. Cras adipiscing enim eu turpis egestas. Eget arcu dictum varius duis at consectetur. Consequat id porta nibh venenatis cras sed felis eget velit. Integer enim neque volutpat ac tincidunt vitae. Feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Ut morbi tincidunt augue interdum velit euismod. Sed cras ornare arcu dui vivamus arcu felis bibendum ut. Eget felis eget nunc lobortis mattis aliquam faucibus purus in. Luctus venenatis lectus magna fringilla urna porttitor rhoncus dolor. Nisl nunc mi ipsum faucibus vitae. Proin fermentum leo vel orci porta. Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Et leo duis ut diam quam. Eros in cursus turpis massa tincidunt. Volutpat est velit egestas dui id. Commodo odio aenean sed adipiscing diam. Quis blandit turpis cursus in hac habitasse platea dictumst quisque. Magna fringilla urna porttitor rhoncus dolor. Amet consectetur adipiscing elit ut aliquam purus sit amet. Vitae justo eget magna fermentum iaculis eu non diam. Hendrerit dolor magna eget est. Ac placerat vestibulum lectus mauris ultrices eros in cursus turpis. Egestas diam in arcu cursus. At varius vel pharetra vel turpis nunc. Lacus vel facilisis volutpat est velit. Ut ornare lectus sit amet est placerat in egestas. Quam adipiscing vitae proin sagittis nisl rhoncus. Dolor purus non enim praesent. Urna condimentum mattis pellentesque id. Magnis dis parturient montes nascetur ridiculus. Feugiat nisl pretium fusce id. Sed cras ornare arcu dui vivamus. Vitae turpis massa sed elementum tempus egestas sed sed. Ac feugiat sed lectus vestibulum mattis ullamcorper velit sed ullamcorper. Ac ut consequat semper viverra nam libero. Consectetur lorem donec massa sapien faucibus. Purus viverra accumsan in nisl nisi scelerisque eu ultrices. Eu turpis egestas pretium aenean pharetra. Nisl rhoncus mattis rhoncus urna neque viverra justo nec ultrices. Pellentesque sit amet porttitor eget dolor morbi non arcu. Vitae justo eget magna fermentum iaculis. Quis auctor elit sed vulputate mi sit. Purus viverra accumsan in nisl nisi scelerisque eu ultrices. Semper auctor neque vitae tempus quam pellentesque nec nam. Rhoncus dolor purus non enim. Sed turpis tincidunt id aliquet risus feugiat. Sit amet justo donec enim diam vulputate ut pharetra sit. Risus pretium quam vulputate dignissim suspendisse in est ante in. Massa sapien faucibus et molestie ac feugiat. Id aliquet risus feugiat in ante metus. Risus ultricies tristique nulla aliquet enim tortor at auctor urna. Sed lectus vestibulum mattis ullamcorper velit sed ullamcorper morbi. Lacus sed turpis tincidunt id aliquet risus feugiat in. Risus ultricies tristique nulla aliquet enim tortor. In ornare quam viverra orci sagittis eu volutpat. Netus et malesuada fames ac turpis egestas sed tempus urna. Fames ac turpis egestas maecenas pharetra convallis posuere morbi. Etiam erat velit scelerisque in dictum non. Cursus turpis massa tincidunt dui ut ornare lectus. Tristique sollicitudin nibh sit amet commodo nulla facilisi. Pellentesque pulvinar pellentesque habitant morbi tristique senectus et. Aliquet eget sit amet tellus cras. Nullam ac tortor vitae purus faucibus ornare. Lacus viverra vitae congue eu consequat. Vulputate ut pharetra sit amet. Est ante in nibh mauris cursus mattis molestie a. Ipsum suspendisse ultrices gravida dictum fusce ut placerat orci. Et tortor at risus viverra. Sed libero enim sed faucibus turpis in eu. Id cursus metus aliquam eleifend mi in nulla posuere sollicitudin. Risus viverra adipiscing at in. Imperdiet massa tincidunt nunc pulvinar sapien et. Nec feugiat in fermentum posuere urna nec tincidunt. Ultricies mi eget mauris pharetra et. Morbi tristique senectus et netus et malesuada fames ac. At quis risus sed vulputate. Interdum velit laoreet id donec. Sapien pellentesque habitant morbi tristique. Pharetra vel turpis nunc eget lorem dolor sed viverra. In massa tempor nec feugiat nisl. Massa tincidunt nunc pulvinar sapien et ligula ullamcorper malesuada proin. Mauris augue neque gravida in. Faucibus vitae aliquet nec ullamcorper sit amet risus. Id velit ut tortor pretium viverra suspendisse potenti. Leo integer malesuada nunc vel risus commodo viverra maecenas. Risus quis varius quam quisque id. Aliquam malesuada bibendum arcu vitae elementum curabitur vitae. Vestibulum lectus mauris ultrices eros in cursus turpis. Fermentum posuere urna nec tincidunt. Magna etiam tempor orci eu lobortis elementum nibh tellus molestie. Id ornare arcu odio ut. Facilisi nullam vehicula ipsum a arcu cursus vitae congue. Nulla pellentesque dignissim enim sit amet venenatis urna cursus eget. Viverra mauris in aliquam sem fringilla ut morbi tincidunt. Quis ipsum suspendisse ultrices gravida dictum fusce ut placerat orci. Sed cras ornare arcu dui vivamus arcu felis. Egestas diam in arcu cursus euismod quis. Tincidunt dui ut ornare lectus. Morbi tristique senectus et netus et. Ornare arcu dui vivamus arcu felis bibendum ut tristique. Habitant morbi tristique senectus et netus et malesuada fames ac. Ut tristique et egestas quis. Mollis aliquam ut porttitor leo. Venenatis tellus in metus vulputate eu scelerisque felis imperdiet proin. Sagittis eu volutpat odio facilisis mauris sit amet massa. Eu facilisis sed odio morbi. Nunc consequat interdum varius sit amet mattis. Velit dignissim sodales ut eu. Pellentesque eu tincidunt tortor aliquam. Porta lorem mollis aliquam ut porttitor. Rhoncus urna neque viverra justo nec ultrices. Viverra suspendisse potenti nullam ac tortor vitae purus. Fermentum posuere urna nec tincidunt praesent semper feugiat nibh sed. Purus sit amet luctus venenatis lectus magna fringilla urna porttitor. Sed lectus vestibulum mattis ullamcorper velit sed ullamcorper. Nulla posuere sollicitudin aliquam ultrices sagittis orci a scelerisque. Nisl nisi scelerisque eu ultrices vitae auctor. In vitae turpis massa sed elementum tempus egestas. Cursus sit amet dictum sit amet justo donec enim. Vitae congue eu consequat ac felis donec et. Augue interdum velit euismod in pellentesque massa placerat. Enim ut sem viverra aliquet eget sit amet. Velit scelerisque in dictum non consectetur a erat. Sed lectus vestibulum mattis ullamcorper velit sed ullamcorper. Nunc faucibus a pellentesque sit amet porttitor eget. Tellus integer feugiat scelerisque varius morbi. Lorem sed risus ultricies tristique nulla aliquet enim tortor at. Eget nulla facilisi etiam dignissim diam quis enim lobortis scelerisque. Adipiscing elit duis tristique sollicitudin. Adipiscing elit pellentesque habitant morbi tristique. Ac tincidunt vitae semper quis lectus nulla at. Maecenas sed enim ut sem viverra. Erat pellentesque adipiscing commodo elit at imperdiet. Dolor morbi non arcu risus quis varius quam quisque. Fringilla urna porttitor rhoncus dolor purus non enim praesent. Tellus integer feugiat scelerisque varius morbi enim nunc faucibus a. Felis eget nunc lobortis mattis aliquam faucibus purus in. Fringilla phasellus faucibus scelerisque eleifend. Pulvinar etiam non quam lacus suspendisse faucibus interdum posuere. Risus ultricies tristique nulla aliquet. Lectus sit amet est placerat. Ac ut consequat semper viverra nam libero justo. Dapibus ultrices in iaculis nunc sed augue. Mattis ullamcorper velit sed ullamcorper. Eget nullam non nisi est. Vitae elementum curabitur vitae nunc sed velit. Sit amet commodo nulla facilisi nullam vehicula ipsum a arcu. Tempor nec feugiat nisl pretium fusce id velit ut. Nulla pellentesque dignissim enim sit amet venenatis. Sed tempus urna et pharetra pharetra. Congue quisque egestas diam in. Convallis posuere morbi leo urna. Nec tincidunt praesent semper feugiat nibh sed pulvinar proin gravida. Sagittis nisl rhoncus mattis rhoncus urna neque viverra justo. Scelerisque felis imperdiet proin fermentum leo vel. Ut placerat orci nulla pellentesque dignissim enim sit amet. In cursus turpis massa tincidunt dui. Rutrum quisque non tellus orci ac auctor augue mauris augue. Cursus vitae congue mauris rhoncus aenean vel elit scelerisque mauris. Scelerisque fermentum dui faucibus in ornare quam viverra orci. Habitant morbi tristique senectus et netus et. Ridiculus mus mauris vitae ultricies leo. Vitae semper quis lectus nulla at volutpat diam. Purus faucibus ornare suspendisse sed nisi. Enim lobortis scelerisque fermentum dui faucibus in ornare quam. Mi tempus imperdiet nulla malesuada pellentesque elit eget. Varius duis at consectetur lorem donec. Pulvinar pellentesque habitant morbi tristique senectus et netus et. A iaculis at erat pellentesque adipiscing commodo elit at imperdiet. Mi ipsum faucibus vitae aliquet nec. Libero volutpat sed cras ornare arcu dui vivamus arcu. Natoque penatibus et magnis dis parturient montes nascetur ridiculus. Maecenas volutpat blandit aliquam etiam erat velit scelerisque. Cras adipiscing enim eu turpis. Nec tincidunt praesent semper feugiat nibh sed pulvinar. Justo laoreet sit amet cursus sit amet dictum sit. Velit scelerisque in dictum non consectetur a erat nam. Turpis tincidunt id aliquet risus feugiat in ante. Aliquet risus feugiat in ante metus dictum. Hac habitasse platea dictumst quisque sagittis purus sit. Et pharetra pharetra massa massa ultricies. Sit amet nisl suscipit adipiscing bibendum est ultricies integer. Venenatis urna cursus eget nunc scelerisque viverra mauris in. Integer quis auctor elit sed. In est ante in nibh mauris cursus mattis molestie. Scelerisque in dictum non consectetur a erat nam at. Lectus sit amet est placerat in. Sit amet cursus sit amet. Nibh nisl condimentum id venenatis a condimentum. Purus ut faucibus pulvinar elementum integer enim. Pharetra sit amet aliquam id diam maecenas. Id cursus metus aliquam eleifend mi in nulla posuere. Lobortis mattis aliquam faucibus purus in massa tempor nec. Urna neque viverra justo nec ultrices dui sapien eget. Enim ut sem viverra aliquet eget sit amet. In eu mi bibendum neque egestas congue quisque egestas. Enim neque volutpat ac tincidunt. Orci ac auctor augue mauris augue neque gravida in fermentum. Velit aliquet sagittis id consectetur. Enim ut sem viverra aliquet eget sit amet tellus. Semper auctor neque vitae tempus quam pellentesque nec. Non blandit massa enim nec dui nunc. Morbi blandit cursus risus at ultrices mi tempus imperdiet nulla. Arcu non odio euismod lacinia at quis risus. Dictum varius duis at consectetur lorem donec massa. Blandit massa enim nec dui. Nibh ipsum consequat nisl vel. Turpis in eu mi bibendum neque. Ut tristique et egestas quis. Ac odio tempor orci dapibus. Gravida dictum fusce ut placerat orci nulla pellentesque dignissim. Integer feugiat scelerisque varius morbi enim. Libero volutpat sed cras ornare arcu dui. Odio aenean sed adipiscing diam. Et egestas quis ipsum suspendisse ultrices. Aliquet lectus proin nibh nisl condimentum. Sit amet consectetur adipiscing elit duis tristique sollicitudin nibh sit. Blandit massa enim nec dui. Tellus molestie nunc non blandit massa enim nec. Tortor vitae purus faucibus ornare suspendisse sed nisi. Nascetur ridiculus mus mauris vitae ultricies leo. Elementum facilisis leo vel fringilla est ullamcorper eget nulla. Diam maecenas ultricies mi eget. Duis tristique sollicitudin nibh sit amet commodo nulla. Tempus iaculis urna id volutpat lacus laoreet non curabitur gravida. Dictumst quisque sagittis purus sit amet. Viverra mauris in aliquam sem. Quis risus sed vulputate odio ut enim blandit volutpat maecenas. Condimentum mattis pellentesque id nibh tortor id. Non sodales neque sodales ut etiam sit amet. Ipsum consequat nisl vel pretium. Cursus in hac habitasse platea dictumst quisque sagittis purus sit. Fringilla est ullamcorper eget nulla facilisi etiam. Tellus elementum sagittis vitae et leo duis ut diam quam. Nisl vel pretium lectus quam id leo in."}}
diff --git a/tests/data/valid/toml-lang-compliance/valid/qa/qa-scalar-string-40kb.toml b/tests/data/valid/toml-lang-compliance/valid/qa/qa-scalar-string-40kb.toml
new file mode 100644
index 0000000..8b06cb0
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/qa/qa-scalar-string-40kb.toml
@@ -0,0 +1 @@
+long = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Quam lacus suspendisse faucibus interdum posuere lorem ipsum dolor. Amet consectetur adipiscing elit ut. Nulla facilisi etiam dignissim diam quis enim lobortis. Curabitur vitae nunc sed velit dignissim sodales ut eu. Fames ac turpis egestas sed tempus urna et. Facilisi cras fermentum odio eu feugiat pretium. Nec tincidunt praesent semper feugiat nibh sed pulvinar proin gravida. Est lorem ipsum dolor sit amet consectetur adipiscing elit. Vel quam elementum pulvinar etiam non quam lacus. Pharetra et ultrices neque ornare aenean euismod. Nisl nisi scelerisque eu ultrices. Eget dolor morbi non arcu risus. Bibendum neque egestas congue quisque egestas diam in arcu cursus. Faucibus nisl tincidunt eget nullam. Nisl pretium fusce id velit ut tortor pretium viverra suspendisse. Mauris ultrices eros in cursus. Donec ac odio tempor orci dapibus ultrices in iaculis. Tellus cras adipiscing enim eu turpis egestas pretium aenean pharetra. Eros in cursus turpis massa. Nascetur ridiculus mus mauris vitae ultricies leo integer malesuada nunc. Velit sed ullamcorper morbi tincidunt ornare massa eget egestas purus. Aenean euismod elementum nisi quis eleifend quam. Magnis dis parturient montes nascetur ridiculus mus. Eu tincidunt tortor aliquam nulla facilisi cras. Tristique senectus et netus et malesuada fames. Urna nec tincidunt praesent semper feugiat nibh sed pulvinar. Vitae ultricies leo integer malesuada nunc vel risus commodo viverra. Ac turpis egestas sed tempus urna et. Amet mauris commodo quis imperdiet massa tincidunt. Urna nunc id cursus metus aliquam eleifend mi. In nulla posuere sollicitudin aliquam ultrices sagittis orci a scelerisque. Neque aliquam vestibulum morbi blandit cursus. Pulvinar mattis nunc sed blandit libero volutpat sed. Sed egestas egestas fringilla phasellus faucibus scelerisque eleifend donec pretium. Blandit cursus risus at ultrices mi tempus. Turpis massa sed elementum tempus egestas sed sed. Dictum varius duis at consectetur lorem. Commodo ullamcorper a lacus vestibulum sed arcu non. Dolor magna eget est lorem. Tincidunt arcu non sodales neque sodales ut etiam sit amet. Sit amet risus nullam eget felis eget nunc lobortis. Risus in hendrerit gravida rutrum quisque non tellus orci. Elementum pulvinar etiam non quam lacus suspendisse faucibus. Morbi tristique senectus et netus et malesuada. In aliquam sem fringilla ut morbi tincidunt. Ornare aenean euismod elementum nisi quis eleifend quam. Sed id semper risus in hendrerit gravida rutrum quisque. Lorem ipsum dolor sit amet consectetur adipiscing elit. A condimentum vitae sapien pellentesque habitant morbi tristique senectus et. Faucibus purus in massa tempor nec feugiat nisl. Vehicula ipsum a arcu cursus vitae congue. Facilisi cras fermentum odio eu feugiat pretium nibh. Viverra mauris in aliquam sem fringilla ut morbi tincidunt. Ultrices dui sapien eget mi proin sed libero enim. Nisi est sit amet facilisis magna etiam tempor. Posuere ac ut consequat semper viverra nam. Dis parturient montes nascetur ridiculus mus mauris vitae. Nec sagittis aliquam malesuada bibendum. Mattis pellentesque id nibh tortor id aliquet lectus. Vitae congue eu consequat ac felis donec et. Cras sed felis eget velit aliquet sagittis id consectetur purus. Pellentesque elit ullamcorper dignissim cras tincidunt. Pellentesque dignissim enim sit amet venenatis urna. A cras semper auctor neque vitae tempus. Amet massa vitae tortor condimentum lacinia quis vel eros donec. Tempor commodo ullamcorper a lacus. Nibh tellus molestie nunc non blandit massa enim nec dui. Viverra orci sagittis eu volutpat odio facilisis mauris sit. Sed augue lacus viverra vitae. Vulputate eu scelerisque felis imperdiet proin fermentum leo vel orci. Tellus rutrum tellus pellentesque eu tincidunt tortor. Cras semper auctor neque vitae tempus quam pellentesque nec. Lorem ipsum dolor sit amet consectetur adipiscing elit ut aliquam. Tristique magna sit amet purus gravida quis blandit turpis. Viverra ipsum nunc aliquet bibendum. Arcu bibendum at varius vel. Amet mattis vulputate enim nulla. Vulputate enim nulla aliquet porttitor. Volutpat blandit aliquam etiam erat velit scelerisque in dictum. Morbi tristique senectus et netus et malesuada fames ac. Faucibus et molestie ac feugiat sed. Tellus elementum sagittis vitae et leo duis. Id aliquet lectus proin nibh. Ornare arcu dui vivamus arcu. Morbi tincidunt augue interdum velit euismod in pellentesque massa placerat. Quis eleifend quam adipiscing vitae. Tristique senectus et netus et malesuada fames ac turpis. Pharetra convallis posuere morbi leo. Ornare arcu odio ut sem nulla pharetra diam sit. Morbi tristique senectus et netus et. Dictum non consectetur a erat nam at lectus urna. Varius vel pharetra vel turpis. Mi ipsum faucibus vitae aliquet. Tellus in metus vulputate eu scelerisque felis imperdiet proin. In est ante in nibh mauris cursus mattis. Massa ultricies mi quis hendrerit dolor magna eget. Fermentum leo vel orci porta. Elit ut aliquam purus sit amet luctus venenatis lectus. Eget aliquet nibh praesent tristique magna sit amet. Arcu non odio euismod lacinia at quis. Montes nascetur ridiculus mus mauris vitae ultricies. Tempus quam pellentesque nec nam aliquam sem et tortor. Morbi leo urna molestie at elementum eu facilisis sed. In fermentum posuere urna nec tincidunt. Neque aliquam vestibulum morbi blandit cursus risus. Vulputate dignissim suspendisse in est ante in nibh mauris cursus. Lorem ipsum dolor sit amet consectetur adipiscing. Orci eu lobortis elementum nibh tellus molestie nunc non. Enim diam vulputate ut pharetra sit amet aliquam. Convallis convallis tellus id interdum velit laoreet id donec ultrices. Sit amet mattis vulputate enim nulla aliquet porttitor lacus luctus. A lacus vestibulum sed arcu non odio. Ut tortor pretium viverra suspendisse potenti nullam ac tortor. Diam vel quam elementum pulvinar etiam non quam. Viverra justo nec ultrices dui. Eu volutpat odio facilisis mauris sit amet massa. Sed ullamcorper morbi tincidunt ornare massa eget egestas purus. Ac felis donec et odio pellentesque. Nisl vel pretium lectus quam id leo in. Ultricies lacus sed turpis tincidunt id. At urna condimentum mattis pellentesque id nibh tortor id. Sem nulla pharetra diam sit amet nisl suscipit. Neque viverra justo nec ultrices. Arcu cursus euismod quis viverra nibh cras pulvinar. Dolor sit amet consectetur adipiscing elit ut aliquam purus. Id diam vel quam elementum pulvinar etiam non. Elementum pulvinar etiam non quam lacus suspendisse faucibus. Id aliquet lectus proin nibh nisl condimentum id venenatis. Sit amet consectetur adipiscing elit duis tristique sollicitudin nibh. Sed faucibus turpis in eu mi bibendum neque egestas congue. Consectetur libero id faucibus nisl tincidunt eget nullam. At volutpat diam ut venenatis tellus in metus vulputate eu. Condimentum lacinia quis vel eros donec ac odio. Sit amet porttitor eget dolor morbi non arcu risus quis. Viverra mauris in aliquam sem fringilla ut morbi tincidunt. Metus dictum at tempor commodo ullamcorper. At ultrices mi tempus imperdiet nulla. Est ullamcorper eget nulla facilisi etiam dignissim diam quis. Lobortis elementum nibh tellus molestie nunc non. Placerat in egestas erat imperdiet sed. Placerat in egestas erat imperdiet sed euismod. Lobortis feugiat vivamus at augue eget arcu dictum varius. Ut sem nulla pharetra diam sit amet. Et tortor at risus viverra adipiscing at in. Tempor nec feugiat nisl pretium. Cursus euismod quis viverra nibh. Eget mi proin sed libero enim sed. Aliquam id diam maecenas ultricies. Mi tempus imperdiet nulla malesuada pellentesque elit eget. Gravida quis blandit turpis cursus in hac habitasse platea dictumst. Sed tempus urna et pharetra pharetra massa massa. Dolor purus non enim praesent elementum facilisis leo vel. Pharetra vel turpis nunc eget. Quam pellentesque nec nam aliquam sem et tortor consequat id. Orci eu lobortis elementum nibh tellus molestie nunc non. Porttitor leo a diam sollicitudin tempor id. Tincidunt ornare massa eget egestas purus viverra accumsan in nisl. Quam lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Elit ut aliquam purus sit amet luctus venenatis lectus. Velit egestas dui id ornare arcu odio ut sem nulla. Lacus viverra vitae congue eu consequat ac felis donec. Nulla aliquet porttitor lacus luctus accumsan tortor posuere ac ut. Lorem dolor sed viverra ipsum. Blandit libero volutpat sed cras ornare arcu. Egestas erat imperdiet sed euismod nisi porta lorem mollis. Viverra maecenas accumsan lacus vel. Enim neque volutpat ac tincidunt. Porttitor massa id neque aliquam vestibulum morbi blandit cursus risus. Malesuada bibendum arcu vitae elementum curabitur vitae nunc. Et malesuada fames ac turpis egestas integer. Egestas egestas fringilla phasellus faucibus scelerisque eleifend donec pretium. Est placerat in egestas erat imperdiet sed. Non arcu risus quis varius quam quisque. Lorem mollis aliquam ut porttitor leo a. Viverra tellus in hac habitasse platea dictumst vestibulum rhoncus. Fermentum iaculis eu non diam. Erat imperdiet sed euismod nisi porta lorem mollis aliquam. Varius vel pharetra vel turpis nunc eget lorem dolor. Rhoncus mattis rhoncus urna neque viverra. Hac habitasse platea dictumst quisque sagittis purus sit. At quis risus sed vulputate odio ut enim. Pharetra magna ac placerat vestibulum lectus mauris ultrices eros. Rutrum quisque non tellus orci ac auctor. Iaculis eu non diam phasellus vestibulum lorem sed. Ut sem nulla pharetra diam sit amet nisl suscipit. Risus at ultrices mi tempus. Vitae tortor condimentum lacinia quis vel eros donec. Sed tempus urna et pharetra. Posuere sollicitudin aliquam ultrices sagittis orci. Congue quisque egestas diam in arcu. Hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Pellentesque habitant morbi tristique senectus et netus et. Id interdum velit laoreet id. Fusce ut placerat orci nulla pellentesque dignissim. Pretium nibh ipsum consequat nisl vel pretium. Etiam erat velit scelerisque in dictum non consectetur a. Turpis in eu mi bibendum neque egestas congue quisque egestas. Pulvinar sapien et ligula ullamcorper malesuada. Ultricies tristique nulla aliquet enim tortor at. Suspendisse interdum consectetur libero id faucibus. Lorem sed risus ultricies tristique nulla aliquet. Tristique senectus et netus et malesuada fames. Eu augue ut lectus arcu bibendum at varius vel. Egestas sed tempus urna et pharetra pharetra massa massa ultricies. Aliquet eget sit amet tellus cras adipiscing. Massa placerat duis ultricies lacus sed turpis tincidunt id aliquet. Ornare massa eget egestas purus viverra accumsan in nisl. Justo laoreet sit amet cursus sit amet. In metus vulputate eu scelerisque felis imperdiet proin. At erat pellentesque adipiscing commodo elit at. Ipsum suspendisse ultrices gravida dictum fusce. Lectus sit amet est placerat in egestas erat. Aliquam ultrices sagittis orci a. Sagittis id consectetur purus ut faucibus pulvinar elementum. Ornare arcu odio ut sem nulla pharetra diam. Sit amet purus gravida quis blandit turpis cursus. Duis ultricies lacus sed turpis tincidunt. Malesuada fames ac turpis egestas sed tempus urna et. Viverra ipsum nunc aliquet bibendum enim facilisis. Et pharetra pharetra massa massa ultricies mi quis. Eget duis at tellus at urna condimentum mattis. Euismod in pellentesque massa placerat. Enim nunc faucibus a pellentesque sit amet porttitor. Dolor sed viverra ipsum nunc aliquet. Donec enim diam vulputate ut pharetra sit amet. Feugiat sed lectus vestibulum mattis ullamcorper velit sed. Erat pellentesque adipiscing commodo elit at imperdiet. Nisl purus in mollis nunc sed id semper risus. Tincidunt augue interdum velit euismod in pellentesque massa. Facilisis magna etiam tempor orci. Mauris in aliquam sem fringilla ut. Gravida dictum fusce ut placerat orci. Sed risus ultricies tristique nulla. Odio morbi quis commodo odio. Feugiat in ante metus dictum at tempor commodo ullamcorper. Porta non pulvinar neque laoreet suspendisse interdum. Etiam tempor orci eu lobortis elementum. Fusce ut placerat orci nulla pellentesque dignissim. Ornare lectus sit amet est placerat in egestas erat. Quis vel eros donec ac. Elementum pulvinar etiam non quam lacus. Sit amet tellus cras adipiscing enim eu turpis. Amet tellus cras adipiscing enim eu. Sed faucibus turpis in eu mi bibendum. Lectus proin nibh nisl condimentum id. Sollicitudin nibh sit amet commodo nulla. Sed tempus urna et pharetra pharetra massa massa. Magna eget est lorem ipsum. Elit ullamcorper dignissim cras tincidunt lobortis feugiat vivamus at. Fermentum dui faucibus in ornare quam viverra orci sagittis eu. Dignissim convallis aenean et tortor. Ut faucibus pulvinar elementum integer enim neque. Nibh cras pulvinar mattis nunc sed. Pellentesque sit amet porttitor eget dolor morbi. Mi eget mauris pharetra et ultrices neque ornare aenean euismod. Quis risus sed vulputate odio ut enim blandit volutpat. Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. In vitae turpis massa sed elementum tempus egestas sed sed. Urna id volutpat lacus laoreet non. Egestas pretium aenean pharetra magna ac placerat. Amet commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Donec et odio pellentesque diam volutpat commodo sed. Etiam non quam lacus suspendisse. Augue neque gravida in fermentum et sollicitudin ac orci. Eu feugiat pretium nibh ipsum. Nam at lectus urna duis convallis convallis tellus id. Egestas integer eget aliquet nibh. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae auctor. Urna condimentum mattis pellentesque id nibh tortor id. In egestas erat imperdiet sed euismod. Ut sem viverra aliquet eget sit amet tellus. Feugiat pretium nibh ipsum consequat nisl vel pretium. Volutpat odio facilisis mauris sit amet. Mi sit amet mauris commodo quis imperdiet massa tincidunt. Neque volutpat ac tincidunt vitae semper quis lectus nulla at. Nec feugiat in fermentum posuere urna nec. Ut venenatis tellus in metus vulputate eu. Vestibulum rhoncus est pellentesque elit ullamcorper dignissim. Eu scelerisque felis imperdiet proin. Vitae et leo duis ut diam quam nulla. Ut venenatis tellus in metus vulputate eu scelerisque. Tincidunt dui ut ornare lectus sit amet. Adipiscing diam donec adipiscing tristique risus. Turpis nunc eget lorem dolor sed viverra ipsum nunc aliquet. Non sodales neque sodales ut. Massa placerat duis ultricies lacus sed turpis tincidunt. Viverra orci sagittis eu volutpat odio facilisis mauris sit amet. Adipiscing vitae proin sagittis nisl. Vitae aliquet nec ullamcorper sit. Potenti nullam ac tortor vitae purus. Ultricies lacus sed turpis tincidunt id. Ut diam quam nulla porttitor massa id neque aliquam vestibulum. Semper eget duis at tellus at urna condimentum mattis pellentesque. Nec tincidunt praesent semper feugiat nibh sed pulvinar proin. Dictum fusce ut placerat orci nulla pellentesque dignissim. Amet luctus venenatis lectus magna fringilla urna. Quam quisque id diam vel quam elementum pulvinar. At tempor commodo ullamcorper a. Magna etiam tempor orci eu lobortis. Suspendisse ultrices gravida dictum fusce. Massa ultricies mi quis hendrerit dolor magna. Massa tincidunt nunc pulvinar sapien et ligula ullamcorper malesuada proin. Aliquet enim tortor at auctor urna nunc id. Semper feugiat nibh sed pulvinar proin gravida. Porttitor rhoncus dolor purus non enim. Metus aliquam eleifend mi in nulla. Lectus arcu bibendum at varius vel pharetra. Sed vulputate odio ut enim blandit volutpat. Et ligula ullamcorper malesuada proin libero nunc consequat interdum varius. Donec et odio pellentesque diam volutpat commodo. Id ornare arcu odio ut sem nulla pharetra diam sit. Est ullamcorper eget nulla facilisi etiam dignissim diam quis enim. Sagittis vitae et leo duis ut diam quam nulla. Elementum nisi quis eleifend quam. Congue mauris rhoncus aenean vel elit. Adipiscing elit duis tristique sollicitudin nibh sit. Egestas egestas fringilla phasellus faucibus scelerisque. Morbi tincidunt augue interdum velit euismod. Massa sed elementum tempus egestas sed sed. Id leo in vitae turpis massa sed elementum tempus egestas. In pellentesque massa placerat duis ultricies lacus sed turpis. Vitae proin sagittis nisl rhoncus mattis rhoncus. Enim tortor at auctor urna nunc id. In fermentum posuere urna nec tincidunt praesent semper feugiat nibh. Aliquam ut porttitor leo a diam sollicitudin tempor id. Pellentesque elit eget gravida cum sociis natoque. Molestie at elementum eu facilisis sed odio morbi quis. Tristique senectus et netus et malesuada fames ac turpis. Proin libero nunc consequat interdum varius sit amet mattis. Pellentesque id nibh tortor id. Risus sed vulputate odio ut enim blandit. Laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt eget. Morbi tincidunt augue interdum velit euismod in pellentesque. Pharetra pharetra massa massa ultricies mi quis hendrerit. Nunc aliquet bibendum enim facilisis gravida neque. Feugiat sed lectus vestibulum mattis ullamcorper velit sed ullamcorper. Risus quis varius quam quisque id diam vel. Et ultrices neque ornare aenean. Aliquet sagittis id consectetur purus ut faucibus pulvinar elementum. Nibh ipsum consequat nisl vel. Mauris rhoncus aenean vel elit scelerisque mauris pellentesque pulvinar. Ornare quam viverra orci sagittis eu volutpat odio facilisis. Euismod nisi porta lorem mollis aliquam. Enim ut tellus elementum sagittis. Rhoncus mattis rhoncus urna neque. Malesuada fames ac turpis egestas. Cursus in hac habitasse platea dictumst quisque sagittis. Sit amet aliquam id diam maecenas ultricies mi eget mauris. Enim sit amet venenatis urna cursus eget nunc. Fermentum odio eu feugiat pretium nibh ipsum consequat. Eu scelerisque felis imperdiet proin. Nullam non nisi est sit amet facilisis magna etiam tempor. In mollis nunc sed id semper risus in hendrerit. Sollicitudin nibh sit amet commodo nulla facilisi nullam. Sit amet nisl purus in mollis nunc sed id. Nam libero justo laoreet sit amet cursus sit amet dictum. Condimentum id venenatis a condimentum vitae sapien pellentesque. Porta nibh venenatis cras sed felis. Lectus nulla at volutpat diam ut venenatis tellus in. Aliquam etiam erat velit scelerisque in dictum non consectetur a. Leo vel fringilla est ullamcorper eget. Sodales ut etiam sit amet nisl purus in mollis nunc. Euismod nisi porta lorem mollis aliquam. Ornare arcu odio ut sem nulla. Sed felis eget velit aliquet sagittis id consectetur. Pellentesque nec nam aliquam sem et tortor consequat id. Enim nec dui nunc mattis enim ut tellus elementum. Nullam non nisi est sit amet facilisis magna. Rutrum quisque non tellus orci ac auctor augue. Nunc vel risus commodo viverra maecenas accumsan lacus. Viverra vitae congue eu consequat. Sollicitudin nibh sit amet commodo nulla. Amet volutpat consequat mauris nunc congue nisi. Maecenas pharetra convallis posuere morbi leo urna molestie at. Mattis vulputate enim nulla aliquet porttitor lacus luctus accumsan tortor. Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc consequat. Adipiscing diam donec adipiscing tristique risus. Elementum curabitur vitae nunc sed velit dignissim sodales ut. Eleifend donec pretium vulputate sapien nec. Commodo quis imperdiet massa tincidunt nunc pulvinar. Proin libero nunc consequat interdum varius sit amet mattis. Facilisis gravida neque convallis a cras semper auctor neque vitae. Quisque egestas diam in arcu cursus. Nunc eget lorem dolor sed viverra ipsum. Mauris sit amet massa vitae tortor condimentum lacinia quis vel. Aliquam sem et tortor consequat id porta nibh venenatis cras. Nunc sed id semper risus in. Enim sed faucibus turpis in eu mi bibendum neque. Molestie nunc non blandit massa enim. Enim praesent elementum facilisis leo vel fringilla est ullamcorper. Semper risus in hendrerit gravida rutrum quisque non tellus orci. Ac turpis egestas maecenas pharetra. In nulla posuere sollicitudin aliquam. Justo nec ultrices dui sapien eget mi proin sed libero. In ornare quam viverra orci sagittis eu. Proin nibh nisl condimentum id venenatis. Morbi enim nunc faucibus a pellentesque sit amet porttitor eget. Quis risus sed vulputate odio ut enim blandit. Risus feugiat in ante metus dictum at tempor commodo. Sodales neque sodales ut etiam. Nunc id cursus metus aliquam. Gravida dictum fusce ut placerat orci nulla pellentesque dignissim enim. Augue ut lectus arcu bibendum at. Quis varius quam quisque id diam vel quam. Egestas congue quisque egestas diam in arcu. Condimentum mattis pellentesque id nibh tortor id aliquet lectus. Enim lobortis scelerisque fermentum dui faucibus in. In tellus integer feugiat scelerisque varius morbi enim nunc. Mattis molestie a iaculis at erat pellentesque. Elit scelerisque mauris pellentesque pulvinar pellentesque habitant morbi tristique. Lorem ipsum dolor sit amet consectetur adipiscing elit ut aliquam. Nisl rhoncus mattis rhoncus urna neque. Ac auctor augue mauris augue neque gravida in fermentum et. Sodales ut eu sem integer vitae justo eget. Sed egestas egestas fringilla phasellus. Viverra adipiscing at in tellus integer feugiat scelerisque varius. Purus gravida quis blandit turpis. Id porta nibh venenatis cras sed. Mattis vulputate enim nulla aliquet porttitor lacus. Augue eget arcu dictum varius duis at consectetur lorem donec. Nulla at volutpat diam ut venenatis tellus in metus. Aliquam etiam erat velit scelerisque in dictum non consectetur. Turpis cursus in hac habitasse platea dictumst. Consequat mauris nunc congue nisi vitae suscipit tellus. Volutpat maecenas volutpat blandit aliquam etiam. Massa massa ultricies mi quis hendrerit dolor magna eget est. Velit egestas dui id ornare arcu. Non consectetur a erat nam at. Orci sagittis eu volutpat odio facilisis mauris sit amet. Dui id ornare arcu odio. Sed arcu non odio euismod lacinia. Feugiat in ante metus dictum. Gravida arcu ac tortor dignissim convallis. Egestas sed tempus urna et pharetra pharetra massa massa. Nulla facilisi nullam vehicula ipsum a arcu. Ipsum a arcu cursus vitae congue mauris. Porttitor rhoncus dolor purus non. Magna sit amet purus gravida quis blandit. Sapien eget mi proin sed libero enim sed faucibus turpis. Nisl nunc mi ipsum faucibus vitae aliquet nec ullamcorper sit. Pellentesque dignissim enim sit amet venenatis urna cursus eget. Pharetra massa massa ultricies mi quis hendrerit. Sapien nec sagittis aliquam malesuada bibendum. Nunc scelerisque viverra mauris in aliquam sem fringilla ut. Dolor magna eget est lorem ipsum dolor. Amet commodo nulla facilisi nullam. Pellentesque elit ullamcorper dignissim cras. Id porta nibh venenatis cras sed felis eget. Nam at lectus urna duis. Laoreet non curabitur gravida arcu ac tortor dignissim convallis. Nunc lobortis mattis aliquam faucibus purus in massa tempor. Sit amet luctus venenatis lectus magna fringilla. Duis ultricies lacus sed turpis tincidunt id. Sed velit dignissim sodales ut eu. Ut tortor pretium viverra suspendisse potenti nullam. Iaculis at erat pellentesque adipiscing. Ipsum nunc aliquet bibendum enim facilisis gravida neque. Nulla aliquet enim tortor at auctor urna nunc id cursus. Amet cursus sit amet dictum sit amet justo donec enim. Enim nunc faucibus a pellentesque sit amet porttitor eget dolor. Pharetra magna ac placerat vestibulum lectus mauris ultrices eros in. Nulla facilisi etiam dignissim diam quis enim. Ut enim blandit volutpat maecenas volutpat blandit aliquam etiam erat. Imperdiet proin fermentum leo vel orci porta non pulvinar neque. Vel fringilla est ullamcorper eget nulla. Bibendum neque egestas congue quisque egestas diam in arcu cursus. Ipsum nunc aliquet bibendum enim facilisis gravida neque convallis a. Arcu cursus vitae congue mauris rhoncus aenean vel elit. Augue eget arcu dictum varius duis. Tristique et egestas quis ipsum. Quis varius quam quisque id. Varius sit amet mattis vulputate. Mattis molestie a iaculis at erat pellentesque. Libero justo laoreet sit amet cursus. Aliquam id diam maecenas ultricies mi eget mauris pharetra. Ut eu sem integer vitae justo eget. Fames ac turpis egestas sed. Suspendisse in est ante in nibh mauris cursus mattis. Faucibus pulvinar elementum integer enim neque volutpat ac tincidunt vitae. Neque vitae tempus quam pellentesque nec nam aliquam. Lobortis elementum nibh tellus molestie nunc non. Lacus vel facilisis volutpat est velit egestas dui. Justo laoreet sit amet cursus sit amet dictum sit amet. Adipiscing enim eu turpis egestas pretium aenean pharetra magna. Cursus metus aliquam eleifend mi in nulla posuere. Nibh mauris cursus mattis molestie a. Dignissim diam quis enim lobortis scelerisque fermentum. A scelerisque purus semper eget duis at tellus. Lacus sed turpis tincidunt id aliquet risus feugiat in. Non tellus orci ac auctor. Ultrices in iaculis nunc sed augue lacus. Tincidunt tortor aliquam nulla facilisi cras. Nulla facilisi nullam vehicula ipsum a arcu cursus vitae congue. Eget magna fermentum iaculis eu non diam phasellus. Pharetra massa massa ultricies mi quis. Eget mauris pharetra et ultrices neque ornare. Aliquam faucibus purus in massa. Facilisi morbi tempus iaculis urna id volutpat lacus. Accumsan lacus vel facilisis volutpat. Curabitur gravida arcu ac tortor. Quam lacus suspendisse faucibus interdum. Elementum nibh tellus molestie nunc non blandit massa enim. Libero id faucibus nisl tincidunt. Bibendum ut tristique et egestas. Ut diam quam nulla porttitor massa id neque aliquam vestibulum. Augue interdum velit euismod in pellentesque. Adipiscing diam donec adipiscing tristique risus nec feugiat. Fringilla ut morbi tincidunt augue interdum velit. Vitae et leo duis ut diam quam nulla porttitor massa. Egestas integer eget aliquet nibh praesent tristique. Posuere sollicitudin aliquam ultrices sagittis orci a. Nisi est sit amet facilisis. Risus quis varius quam quisque id diam. Faucibus turpis in eu mi. Et molestie ac feugiat sed lectus vestibulum. Porttitor lacus luctus accumsan tortor posuere ac. Platea dictumst vestibulum rhoncus est pellentesque. Tortor pretium viverra suspendisse potenti nullam ac tortor. Enim praesent elementum facilisis leo vel fringilla est. Proin libero nunc consequat interdum varius sit amet mattis vulputate. Turpis egestas pretium aenean pharetra magna ac placerat vestibulum lectus. Nulla pharetra diam sit amet nisl suscipit. Mauris nunc congue nisi vitae suscipit tellus mauris a diam. Faucibus in ornare quam viverra orci sagittis eu volutpat. Volutpat consequat mauris nunc congue nisi vitae. Dui nunc mattis enim ut tellus. Adipiscing elit ut aliquam purus sit amet luctus. Tempus egestas sed sed risus. Scelerisque fermentum dui faucibus in ornare quam viverra orci. Massa ultricies mi quis hendrerit dolor magna eget. Pulvinar mattis nunc sed blandit libero volutpat sed cras ornare. Ut eu sem integer vitae justo eget magna fermentum. Ornare quam viverra orci sagittis. Eget dolor morbi non arcu risus quis varius quam. Tincidunt praesent semper feugiat nibh sed pulvinar. Sit amet justo donec enim diam vulputate. Dui faucibus in ornare quam viverra. Tincidunt tortor aliquam nulla facilisi cras fermentum odio eu. Turpis egestas sed tempus urna et. Pretium quam vulputate dignissim suspendisse in est ante in. Morbi quis commodo odio aenean sed adipiscing diam donec. Nunc mattis enim ut tellus elementum sagittis vitae et. Diam vel quam elementum pulvinar etiam non quam. Convallis posuere morbi leo urna molestie at elementum eu. Adipiscing at in tellus integer feugiat scelerisque varius morbi. Quis varius quam quisque id diam vel quam elementum. Dui accumsan sit amet nulla. Adipiscing elit duis tristique sollicitudin nibh sit amet commodo. Viverra ipsum nunc aliquet bibendum enim facilisis. Porta lorem mollis aliquam ut. Velit ut tortor pretium viverra suspendisse potenti. Quis viverra nibh cras pulvinar mattis nunc sed blandit. Pharetra magna ac placerat vestibulum. Mauris ultrices eros in cursus turpis massa. Lacus vestibulum sed arcu non odio euismod lacinia at. Dapibus ultrices in iaculis nunc sed. Cras adipiscing enim eu turpis egestas. Eget arcu dictum varius duis at consectetur. Consequat id porta nibh venenatis cras sed felis eget velit. Integer enim neque volutpat ac tincidunt vitae. Feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Ut morbi tincidunt augue interdum velit euismod. Sed cras ornare arcu dui vivamus arcu felis bibendum ut. Eget felis eget nunc lobortis mattis aliquam faucibus purus in. Luctus venenatis lectus magna fringilla urna porttitor rhoncus dolor. Nisl nunc mi ipsum faucibus vitae. Proin fermentum leo vel orci porta. Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Et leo duis ut diam quam. Eros in cursus turpis massa tincidunt. Volutpat est velit egestas dui id. Commodo odio aenean sed adipiscing diam. Quis blandit turpis cursus in hac habitasse platea dictumst quisque. Magna fringilla urna porttitor rhoncus dolor. Amet consectetur adipiscing elit ut aliquam purus sit amet. Vitae justo eget magna fermentum iaculis eu non diam. Hendrerit dolor magna eget est. Ac placerat vestibulum lectus mauris ultrices eros in cursus turpis. Egestas diam in arcu cursus. At varius vel pharetra vel turpis nunc. Lacus vel facilisis volutpat est velit. Ut ornare lectus sit amet est placerat in egestas. Quam adipiscing vitae proin sagittis nisl rhoncus. Dolor purus non enim praesent. Urna condimentum mattis pellentesque id. Magnis dis parturient montes nascetur ridiculus. Feugiat nisl pretium fusce id. Sed cras ornare arcu dui vivamus. Vitae turpis massa sed elementum tempus egestas sed sed. Ac feugiat sed lectus vestibulum mattis ullamcorper velit sed ullamcorper. Ac ut consequat semper viverra nam libero. Consectetur lorem donec massa sapien faucibus. Purus viverra accumsan in nisl nisi scelerisque eu ultrices. Eu turpis egestas pretium aenean pharetra. Nisl rhoncus mattis rhoncus urna neque viverra justo nec ultrices. Pellentesque sit amet porttitor eget dolor morbi non arcu. Vitae justo eget magna fermentum iaculis. Quis auctor elit sed vulputate mi sit. Purus viverra accumsan in nisl nisi scelerisque eu ultrices. Semper auctor neque vitae tempus quam pellentesque nec nam. Rhoncus dolor purus non enim. Sed turpis tincidunt id aliquet risus feugiat. Sit amet justo donec enim diam vulputate ut pharetra sit. Risus pretium quam vulputate dignissim suspendisse in est ante in. Massa sapien faucibus et molestie ac feugiat. Id aliquet risus feugiat in ante metus. Risus ultricies tristique nulla aliquet enim tortor at auctor urna. Sed lectus vestibulum mattis ullamcorper velit sed ullamcorper morbi. Lacus sed turpis tincidunt id aliquet risus feugiat in. Risus ultricies tristique nulla aliquet enim tortor. In ornare quam viverra orci sagittis eu volutpat. Netus et malesuada fames ac turpis egestas sed tempus urna. Fames ac turpis egestas maecenas pharetra convallis posuere morbi. Etiam erat velit scelerisque in dictum non. Cursus turpis massa tincidunt dui ut ornare lectus. Tristique sollicitudin nibh sit amet commodo nulla facilisi. Pellentesque pulvinar pellentesque habitant morbi tristique senectus et. Aliquet eget sit amet tellus cras. Nullam ac tortor vitae purus faucibus ornare. Lacus viverra vitae congue eu consequat. Vulputate ut pharetra sit amet. Est ante in nibh mauris cursus mattis molestie a. Ipsum suspendisse ultrices gravida dictum fusce ut placerat orci. Et tortor at risus viverra. Sed libero enim sed faucibus turpis in eu. Id cursus metus aliquam eleifend mi in nulla posuere sollicitudin. Risus viverra adipiscing at in. Imperdiet massa tincidunt nunc pulvinar sapien et. Nec feugiat in fermentum posuere urna nec tincidunt. Ultricies mi eget mauris pharetra et. Morbi tristique senectus et netus et malesuada fames ac. At quis risus sed vulputate. Interdum velit laoreet id donec. Sapien pellentesque habitant morbi tristique. Pharetra vel turpis nunc eget lorem dolor sed viverra. In massa tempor nec feugiat nisl. Massa tincidunt nunc pulvinar sapien et ligula ullamcorper malesuada proin. Mauris augue neque gravida in. Faucibus vitae aliquet nec ullamcorper sit amet risus. Id velit ut tortor pretium viverra suspendisse potenti. Leo integer malesuada nunc vel risus commodo viverra maecenas. Risus quis varius quam quisque id. Aliquam malesuada bibendum arcu vitae elementum curabitur vitae. Vestibulum lectus mauris ultrices eros in cursus turpis. Fermentum posuere urna nec tincidunt. Magna etiam tempor orci eu lobortis elementum nibh tellus molestie. Id ornare arcu odio ut. Facilisi nullam vehicula ipsum a arcu cursus vitae congue. Nulla pellentesque dignissim enim sit amet venenatis urna cursus eget. Viverra mauris in aliquam sem fringilla ut morbi tincidunt. Quis ipsum suspendisse ultrices gravida dictum fusce ut placerat orci. Sed cras ornare arcu dui vivamus arcu felis. Egestas diam in arcu cursus euismod quis. Tincidunt dui ut ornare lectus. Morbi tristique senectus et netus et. Ornare arcu dui vivamus arcu felis bibendum ut tristique. Habitant morbi tristique senectus et netus et malesuada fames ac. Ut tristique et egestas quis. Mollis aliquam ut porttitor leo. Venenatis tellus in metus vulputate eu scelerisque felis imperdiet proin. Sagittis eu volutpat odio facilisis mauris sit amet massa. Eu facilisis sed odio morbi. Nunc consequat interdum varius sit amet mattis. Velit dignissim sodales ut eu. Pellentesque eu tincidunt tortor aliquam. Porta lorem mollis aliquam ut porttitor. Rhoncus urna neque viverra justo nec ultrices. Viverra suspendisse potenti nullam ac tortor vitae purus. Fermentum posuere urna nec tincidunt praesent semper feugiat nibh sed. Purus sit amet luctus venenatis lectus magna fringilla urna porttitor. Sed lectus vestibulum mattis ullamcorper velit sed ullamcorper. Nulla posuere sollicitudin aliquam ultrices sagittis orci a scelerisque. Nisl nisi scelerisque eu ultrices vitae auctor. In vitae turpis massa sed elementum tempus egestas. Cursus sit amet dictum sit amet justo donec enim. Vitae congue eu consequat ac felis donec et. Augue interdum velit euismod in pellentesque massa placerat. Enim ut sem viverra aliquet eget sit amet. Velit scelerisque in dictum non consectetur a erat. Sed lectus vestibulum mattis ullamcorper velit sed ullamcorper. Nunc faucibus a pellentesque sit amet porttitor eget. Tellus integer feugiat scelerisque varius morbi. Lorem sed risus ultricies tristique nulla aliquet enim tortor at. Eget nulla facilisi etiam dignissim diam quis enim lobortis scelerisque. Adipiscing elit duis tristique sollicitudin. Adipiscing elit pellentesque habitant morbi tristique. Ac tincidunt vitae semper quis lectus nulla at. Maecenas sed enim ut sem viverra. Erat pellentesque adipiscing commodo elit at imperdiet. Dolor morbi non arcu risus quis varius quam quisque. Fringilla urna porttitor rhoncus dolor purus non enim praesent. Tellus integer feugiat scelerisque varius morbi enim nunc faucibus a. Felis eget nunc lobortis mattis aliquam faucibus purus in. Fringilla phasellus faucibus scelerisque eleifend. Pulvinar etiam non quam lacus suspendisse faucibus interdum posuere. Risus ultricies tristique nulla aliquet. Lectus sit amet est placerat. Ac ut consequat semper viverra nam libero justo. Dapibus ultrices in iaculis nunc sed augue. Mattis ullamcorper velit sed ullamcorper. Eget nullam non nisi est. Vitae elementum curabitur vitae nunc sed velit. Sit amet commodo nulla facilisi nullam vehicula ipsum a arcu. Tempor nec feugiat nisl pretium fusce id velit ut. Nulla pellentesque dignissim enim sit amet venenatis. Sed tempus urna et pharetra pharetra. Congue quisque egestas diam in. Convallis posuere morbi leo urna. Nec tincidunt praesent semper feugiat nibh sed pulvinar proin gravida. Sagittis nisl rhoncus mattis rhoncus urna neque viverra justo. Scelerisque felis imperdiet proin fermentum leo vel. Ut placerat orci nulla pellentesque dignissim enim sit amet. In cursus turpis massa tincidunt dui. Rutrum quisque non tellus orci ac auctor augue mauris augue. Cursus vitae congue mauris rhoncus aenean vel elit scelerisque mauris. Scelerisque fermentum dui faucibus in ornare quam viverra orci. Habitant morbi tristique senectus et netus et. Ridiculus mus mauris vitae ultricies leo. Vitae semper quis lectus nulla at volutpat diam. Purus faucibus ornare suspendisse sed nisi. Enim lobortis scelerisque fermentum dui faucibus in ornare quam. Mi tempus imperdiet nulla malesuada pellentesque elit eget. Varius duis at consectetur lorem donec. Pulvinar pellentesque habitant morbi tristique senectus et netus et. A iaculis at erat pellentesque adipiscing commodo elit at imperdiet. Mi ipsum faucibus vitae aliquet nec. Libero volutpat sed cras ornare arcu dui vivamus arcu. Natoque penatibus et magnis dis parturient montes nascetur ridiculus. Maecenas volutpat blandit aliquam etiam erat velit scelerisque. Cras adipiscing enim eu turpis. Nec tincidunt praesent semper feugiat nibh sed pulvinar. Justo laoreet sit amet cursus sit amet dictum sit. Velit scelerisque in dictum non consectetur a erat nam. Turpis tincidunt id aliquet risus feugiat in ante. Aliquet risus feugiat in ante metus dictum. Hac habitasse platea dictumst quisque sagittis purus sit. Et pharetra pharetra massa massa ultricies. Sit amet nisl suscipit adipiscing bibendum est ultricies integer. Venenatis urna cursus eget nunc scelerisque viverra mauris in. Integer quis auctor elit sed. In est ante in nibh mauris cursus mattis molestie. Scelerisque in dictum non consectetur a erat nam at. Lectus sit amet est placerat in. Sit amet cursus sit amet. Nibh nisl condimentum id venenatis a condimentum. Purus ut faucibus pulvinar elementum integer enim. Pharetra sit amet aliquam id diam maecenas. Id cursus metus aliquam eleifend mi in nulla posuere. Lobortis mattis aliquam faucibus purus in massa tempor nec. Urna neque viverra justo nec ultrices dui sapien eget. Enim ut sem viverra aliquet eget sit amet. In eu mi bibendum neque egestas congue quisque egestas. Enim neque volutpat ac tincidunt. Orci ac auctor augue mauris augue neque gravida in fermentum. Velit aliquet sagittis id consectetur. Enim ut sem viverra aliquet eget sit amet tellus. Semper auctor neque vitae tempus quam pellentesque nec. Non blandit massa enim nec dui nunc. Morbi blandit cursus risus at ultrices mi tempus imperdiet nulla. Arcu non odio euismod lacinia at quis risus. Dictum varius duis at consectetur lorem donec massa. Blandit massa enim nec dui. Nibh ipsum consequat nisl vel. Turpis in eu mi bibendum neque. Ut tristique et egestas quis. Ac odio tempor orci dapibus. Gravida dictum fusce ut placerat orci nulla pellentesque dignissim. Integer feugiat scelerisque varius morbi enim. Libero volutpat sed cras ornare arcu dui. Odio aenean sed adipiscing diam. Et egestas quis ipsum suspendisse ultrices. Aliquet lectus proin nibh nisl condimentum. Sit amet consectetur adipiscing elit duis tristique sollicitudin nibh sit. Blandit massa enim nec dui. Tellus molestie nunc non blandit massa enim nec. Tortor vitae purus faucibus ornare suspendisse sed nisi. Nascetur ridiculus mus mauris vitae ultricies leo. Elementum facilisis leo vel fringilla est ullamcorper eget nulla. Diam maecenas ultricies mi eget. Duis tristique sollicitudin nibh sit amet commodo nulla. Tempus iaculis urna id volutpat lacus laoreet non curabitur gravida. Dictumst quisque sagittis purus sit amet. Viverra mauris in aliquam sem. Quis risus sed vulputate odio ut enim blandit volutpat maecenas. Condimentum mattis pellentesque id nibh tortor id. Non sodales neque sodales ut etiam sit amet. Ipsum consequat nisl vel pretium. Cursus in hac habitasse platea dictumst quisque sagittis purus sit. Fringilla est ullamcorper eget nulla facilisi etiam. Tellus elementum sagittis vitae et leo duis ut diam quam. Nisl vel pretium lectus quam id leo in."
diff --git a/tests/data/valid/toml-lang-compliance/valid/qa/qa-scalar-string-multiline-40kb.json b/tests/data/valid/toml-lang-compliance/valid/qa/qa-scalar-string-multiline-40kb.json
new file mode 100644
index 0000000..d493410
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/qa/qa-scalar-string-multiline-40kb.json
@@ -0,0 +1,2 @@
+{"long":
+ {"type":"string","value":"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Quam lacus suspendisse faucibus interdum posuere lorem ipsum dolor. Amet consectetur adipiscing elit ut. Nulla facilisi etiam dignissim diam quis enim lobortis. Curabitur vitae nunc sed velit dignissim sodales ut eu. Fames ac turpis egestas sed tempus urna et. Facilisi cras fermentum odio eu feugiat pretium. Nec tincidunt praesent semper feugiat nibh sed pulvinar proin gravida. Est lorem ipsum dolor sit amet consectetur adipiscing elit. Vel quam elementum pulvinar etiam non quam lacus. Pharetra et ultrices neque ornare aenean euismod. Nisl nisi scelerisque eu ultrices. Eget dolor morbi non arcu risus. Bibendum neque egestas congue quisque egestas diam in arcu cursus. Faucibus nisl tincidunt eget nullam. Nisl pretium fusce id velit ut tortor pretium viverra suspendisse. Mauris ultrices eros in cursus. Donec ac odio tempor orci dapibus ultrices in iaculis. Tellus cras adipiscing enim eu turpis egestas pretium aenean pharetra.\n\nEros in cursus turpis massa. Nascetur ridiculus mus mauris vitae ultricies leo integer malesuada nunc. Velit sed ullamcorper morbi tincidunt ornare massa eget egestas purus. Aenean euismod elementum nisi quis eleifend quam. Magnis dis parturient montes nascetur ridiculus mus. Eu tincidunt tortor aliquam nulla facilisi cras. Tristique senectus et netus et malesuada fames. Urna nec tincidunt praesent semper feugiat nibh sed pulvinar. Vitae ultricies leo integer malesuada nunc vel risus commodo viverra. Ac turpis egestas sed tempus urna et. Amet mauris commodo quis imperdiet massa tincidunt. Urna nunc id cursus metus aliquam eleifend mi. In nulla posuere sollicitudin aliquam ultrices sagittis orci a scelerisque. Neque aliquam vestibulum morbi blandit cursus. Pulvinar mattis nunc sed blandit libero volutpat sed. Sed egestas egestas fringilla phasellus faucibus scelerisque eleifend donec pretium.\n\nBlandit cursus risus at ultrices mi tempus. Turpis massa sed elementum tempus egestas sed sed. Dictum varius duis at consectetur lorem. Commodo ullamcorper a lacus vestibulum sed arcu non. Dolor magna eget est lorem. Tincidunt arcu non sodales neque sodales ut etiam sit amet. Sit amet risus nullam eget felis eget nunc lobortis. Risus in hendrerit gravida rutrum quisque non tellus orci. Elementum pulvinar etiam non quam lacus suspendisse faucibus. Morbi tristique senectus et netus et malesuada. In aliquam sem fringilla ut morbi tincidunt. Ornare aenean euismod elementum nisi quis eleifend quam. Sed id semper risus in hendrerit gravida rutrum quisque. Lorem ipsum dolor sit amet consectetur adipiscing elit. A condimentum vitae sapien pellentesque habitant morbi tristique senectus et. Faucibus purus in massa tempor nec feugiat nisl. Vehicula ipsum a arcu cursus vitae congue. Facilisi cras fermentum odio eu feugiat pretium nibh. Viverra mauris in aliquam sem fringilla ut morbi tincidunt. Ultrices dui sapien eget mi proin sed libero enim.\n\nNisi est sit amet facilisis magna etiam tempor. Posuere ac ut consequat semper viverra nam. Dis parturient montes nascetur ridiculus mus mauris vitae. Nec sagittis aliquam malesuada bibendum. Mattis pellentesque id nibh tortor id aliquet lectus. Vitae congue eu consequat ac felis donec et. Cras sed felis eget velit aliquet sagittis id consectetur purus. Pellentesque elit ullamcorper dignissim cras tincidunt. Pellentesque dignissim enim sit amet venenatis urna. A cras semper auctor neque vitae tempus. Amet massa vitae tortor condimentum lacinia quis vel eros donec. Tempor commodo ullamcorper a lacus. Nibh tellus molestie nunc non blandit massa enim nec dui. Viverra orci sagittis eu volutpat odio facilisis mauris sit. Sed augue lacus viverra vitae. Vulputate eu scelerisque felis imperdiet proin fermentum leo vel orci. Tellus rutrum tellus pellentesque eu tincidunt tortor.\n\nCras semper auctor neque vitae tempus quam pellentesque nec. Lorem ipsum dolor sit amet consectetur adipiscing elit ut aliquam. Tristique magna sit amet purus gravida quis blandit turpis. Viverra ipsum nunc aliquet bibendum. Arcu bibendum at varius vel. Amet mattis vulputate enim nulla. Vulputate enim nulla aliquet porttitor. Volutpat blandit aliquam etiam erat velit scelerisque in dictum. Morbi tristique senectus et netus et malesuada fames ac. Faucibus et molestie ac feugiat sed.\n\nTellus elementum sagittis vitae et leo duis. Id aliquet lectus proin nibh. Ornare arcu dui vivamus arcu. Morbi tincidunt augue interdum velit euismod in pellentesque massa placerat. Quis eleifend quam adipiscing vitae. Tristique senectus et netus et malesuada fames ac turpis. Pharetra convallis posuere morbi leo. Ornare arcu odio ut sem nulla pharetra diam sit. Morbi tristique senectus et netus et. Dictum non consectetur a erat nam at lectus urna.\n\nVarius vel pharetra vel turpis. Mi ipsum faucibus vitae aliquet. Tellus in metus vulputate eu scelerisque felis imperdiet proin. In est ante in nibh mauris cursus mattis. Massa ultricies mi quis hendrerit dolor magna eget. Fermentum leo vel orci porta. Elit ut aliquam purus sit amet luctus venenatis lectus. Eget aliquet nibh praesent tristique magna sit amet. Arcu non odio euismod lacinia at quis. Montes nascetur ridiculus mus mauris vitae ultricies. Tempus quam pellentesque nec nam aliquam sem et tortor. Morbi leo urna molestie at elementum eu facilisis sed.\n\nIn fermentum posuere urna nec tincidunt. Neque aliquam vestibulum morbi blandit cursus risus. Vulputate dignissim suspendisse in est ante in nibh mauris cursus. Lorem ipsum dolor sit amet consectetur adipiscing. Orci eu lobortis elementum nibh tellus molestie nunc non. Enim diam vulputate ut pharetra sit amet aliquam. Convallis convallis tellus id interdum velit laoreet id donec ultrices. Sit amet mattis vulputate enim nulla aliquet porttitor lacus luctus. A lacus vestibulum sed arcu non odio. Ut tortor pretium viverra suspendisse potenti nullam ac tortor. Diam vel quam elementum pulvinar etiam non quam. Viverra justo nec ultrices dui. Eu volutpat odio facilisis mauris sit amet massa. Sed ullamcorper morbi tincidunt ornare massa eget egestas purus. Ac felis donec et odio pellentesque. Nisl vel pretium lectus quam id leo in. Ultricies lacus sed turpis tincidunt id.\n\nAt urna condimentum mattis pellentesque id nibh tortor id. Sem nulla pharetra diam sit amet nisl suscipit. Neque viverra justo nec ultrices. Arcu cursus euismod quis viverra nibh cras pulvinar. Dolor sit amet consectetur adipiscing elit ut aliquam purus. Id diam vel quam elementum pulvinar etiam non. Elementum pulvinar etiam non quam lacus suspendisse faucibus. Id aliquet lectus proin nibh nisl condimentum id venenatis. Sit amet consectetur adipiscing elit duis tristique sollicitudin nibh. Sed faucibus turpis in eu mi bibendum neque egestas congue. Consectetur libero id faucibus nisl tincidunt eget nullam. At volutpat diam ut venenatis tellus in metus vulputate eu. Condimentum lacinia quis vel eros donec ac odio. Sit amet porttitor eget dolor morbi non arcu risus quis. Viverra mauris in aliquam sem fringilla ut morbi tincidunt. Metus dictum at tempor commodo ullamcorper. At ultrices mi tempus imperdiet nulla. Est ullamcorper eget nulla facilisi etiam dignissim diam quis. Lobortis elementum nibh tellus molestie nunc non. Placerat in egestas erat imperdiet sed.\n\nPlacerat in egestas erat imperdiet sed euismod. Lobortis feugiat vivamus at augue eget arcu dictum varius. Ut sem nulla pharetra diam sit amet. Et tortor at risus viverra adipiscing at in. Tempor nec feugiat nisl pretium. Cursus euismod quis viverra nibh. Eget mi proin sed libero enim sed. Aliquam id diam maecenas ultricies. Mi tempus imperdiet nulla malesuada pellentesque elit eget. Gravida quis blandit turpis cursus in hac habitasse platea dictumst. Sed tempus urna et pharetra pharetra massa massa. Dolor purus non enim praesent elementum facilisis leo vel.\n\nPharetra vel turpis nunc eget. Quam pellentesque nec nam aliquam sem et tortor consequat id. Orci eu lobortis elementum nibh tellus molestie nunc non. Porttitor leo a diam sollicitudin tempor id. Tincidunt ornare massa eget egestas purus viverra accumsan in nisl. Quam lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Elit ut aliquam purus sit amet luctus venenatis lectus. Velit egestas dui id ornare arcu odio ut sem nulla. Lacus viverra vitae congue eu consequat ac felis donec. Nulla aliquet porttitor lacus luctus accumsan tortor posuere ac ut. Lorem dolor sed viverra ipsum. Blandit libero volutpat sed cras ornare arcu. Egestas erat imperdiet sed euismod nisi porta lorem mollis. Viverra maecenas accumsan lacus vel. Enim neque volutpat ac tincidunt. Porttitor massa id neque aliquam vestibulum morbi blandit cursus risus. Malesuada bibendum arcu vitae elementum curabitur vitae nunc.\n\nEt malesuada fames ac turpis egestas integer. Egestas egestas fringilla phasellus faucibus scelerisque eleifend donec pretium. Est placerat in egestas erat imperdiet sed. Non arcu risus quis varius quam quisque. Lorem mollis aliquam ut porttitor leo a. Viverra tellus in hac habitasse platea dictumst vestibulum rhoncus. Fermentum iaculis eu non diam. Erat imperdiet sed euismod nisi porta lorem mollis aliquam. Varius vel pharetra vel turpis nunc eget lorem dolor. Rhoncus mattis rhoncus urna neque viverra. Hac habitasse platea dictumst quisque sagittis purus sit. At quis risus sed vulputate odio ut enim. Pharetra magna ac placerat vestibulum lectus mauris ultrices eros. Rutrum quisque non tellus orci ac auctor. Iaculis eu non diam phasellus vestibulum lorem sed. Ut sem nulla pharetra diam sit amet nisl suscipit. Risus at ultrices mi tempus. Vitae tortor condimentum lacinia quis vel eros donec. Sed tempus urna et pharetra. Posuere sollicitudin aliquam ultrices sagittis orci.\n\nCongue quisque egestas diam in arcu. Hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Pellentesque habitant morbi tristique senectus et netus et. Id interdum velit laoreet id. Fusce ut placerat orci nulla pellentesque dignissim. Pretium nibh ipsum consequat nisl vel pretium. Etiam erat velit scelerisque in dictum non consectetur a. Turpis in eu mi bibendum neque egestas congue quisque egestas. Pulvinar sapien et ligula ullamcorper malesuada. Ultricies tristique nulla aliquet enim tortor at. Suspendisse interdum consectetur libero id faucibus. Lorem sed risus ultricies tristique nulla aliquet. Tristique senectus et netus et malesuada fames. Eu augue ut lectus arcu bibendum at varius vel. Egestas sed tempus urna et pharetra pharetra massa massa ultricies. Aliquet eget sit amet tellus cras adipiscing. Massa placerat duis ultricies lacus sed turpis tincidunt id aliquet. Ornare massa eget egestas purus viverra accumsan in nisl. Justo laoreet sit amet cursus sit amet.\n\nIn metus vulputate eu scelerisque felis imperdiet proin. At erat pellentesque adipiscing commodo elit at. Ipsum suspendisse ultrices gravida dictum fusce. Lectus sit amet est placerat in egestas erat. Aliquam ultrices sagittis orci a. Sagittis id consectetur purus ut faucibus pulvinar elementum. Ornare arcu odio ut sem nulla pharetra diam. Sit amet purus gravida quis blandit turpis cursus. Duis ultricies lacus sed turpis tincidunt. Malesuada fames ac turpis egestas sed tempus urna et. Viverra ipsum nunc aliquet bibendum enim facilisis. Et pharetra pharetra massa massa ultricies mi quis. Eget duis at tellus at urna condimentum mattis. Euismod in pellentesque massa placerat. Enim nunc faucibus a pellentesque sit amet porttitor. Dolor sed viverra ipsum nunc aliquet. Donec enim diam vulputate ut pharetra sit amet. Feugiat sed lectus vestibulum mattis ullamcorper velit sed. Erat pellentesque adipiscing commodo elit at imperdiet. Nisl purus in mollis nunc sed id semper risus.\n\nTincidunt augue interdum velit euismod in pellentesque massa. Facilisis magna etiam tempor orci. Mauris in aliquam sem fringilla ut. Gravida dictum fusce ut placerat orci. Sed risus ultricies tristique nulla. Odio morbi quis commodo odio. Feugiat in ante metus dictum at tempor commodo ullamcorper. Porta non pulvinar neque laoreet suspendisse interdum. Etiam tempor orci eu lobortis elementum. Fusce ut placerat orci nulla pellentesque dignissim. Ornare lectus sit amet est placerat in egestas erat. Quis vel eros donec ac. Elementum pulvinar etiam non quam lacus. Sit amet tellus cras adipiscing enim eu turpis. Amet tellus cras adipiscing enim eu. Sed faucibus turpis in eu mi bibendum. Lectus proin nibh nisl condimentum id.\n\nSollicitudin nibh sit amet commodo nulla. Sed tempus urna et pharetra pharetra massa massa. Magna eget est lorem ipsum. Elit ullamcorper dignissim cras tincidunt lobortis feugiat vivamus at. Fermentum dui faucibus in ornare quam viverra orci sagittis eu. Dignissim convallis aenean et tortor. Ut faucibus pulvinar elementum integer enim neque. Nibh cras pulvinar mattis nunc sed. Pellentesque sit amet porttitor eget dolor morbi. Mi eget mauris pharetra et ultrices neque ornare aenean euismod. Quis risus sed vulputate odio ut enim blandit volutpat. Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. In vitae turpis massa sed elementum tempus egestas sed sed. Urna id volutpat lacus laoreet non. Egestas pretium aenean pharetra magna ac placerat. Amet commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Donec et odio pellentesque diam volutpat commodo sed. Etiam non quam lacus suspendisse.\n\nAugue neque gravida in fermentum et sollicitudin ac orci. Eu feugiat pretium nibh ipsum. Nam at lectus urna duis convallis convallis tellus id. Egestas integer eget aliquet nibh. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae auctor. Urna condimentum mattis pellentesque id nibh tortor id. In egestas erat imperdiet sed euismod. Ut sem viverra aliquet eget sit amet tellus. Feugiat pretium nibh ipsum consequat nisl vel pretium. Volutpat odio facilisis mauris sit amet.\n\nMi sit amet mauris commodo quis imperdiet massa tincidunt. Neque volutpat ac tincidunt vitae semper quis lectus nulla at. Nec feugiat in fermentum posuere urna nec. Ut venenatis tellus in metus vulputate eu. Vestibulum rhoncus est pellentesque elit ullamcorper dignissim. Eu scelerisque felis imperdiet proin. Vitae et leo duis ut diam quam nulla. Ut venenatis tellus in metus vulputate eu scelerisque. Tincidunt dui ut ornare lectus sit amet. Adipiscing diam donec adipiscing tristique risus. Turpis nunc eget lorem dolor sed viverra ipsum nunc aliquet. Non sodales neque sodales ut. Massa placerat duis ultricies lacus sed turpis tincidunt. Viverra orci sagittis eu volutpat odio facilisis mauris sit amet.\n\nAdipiscing vitae proin sagittis nisl. Vitae aliquet nec ullamcorper sit. Potenti nullam ac tortor vitae purus. Ultricies lacus sed turpis tincidunt id. Ut diam quam nulla porttitor massa id neque aliquam vestibulum. Semper eget duis at tellus at urna condimentum mattis pellentesque. Nec tincidunt praesent semper feugiat nibh sed pulvinar proin. Dictum fusce ut placerat orci nulla pellentesque dignissim. Amet luctus venenatis lectus magna fringilla urna. Quam quisque id diam vel quam elementum pulvinar. At tempor commodo ullamcorper a. Magna etiam tempor orci eu lobortis. Suspendisse ultrices gravida dictum fusce. Massa ultricies mi quis hendrerit dolor magna.\n\nMassa tincidunt nunc pulvinar sapien et ligula ullamcorper malesuada proin. Aliquet enim tortor at auctor urna nunc id. Semper feugiat nibh sed pulvinar proin gravida. Porttitor rhoncus dolor purus non enim. Metus aliquam eleifend mi in nulla. Lectus arcu bibendum at varius vel pharetra. Sed vulputate odio ut enim blandit volutpat. Et ligula ullamcorper malesuada proin libero nunc consequat interdum varius. Donec et odio pellentesque diam volutpat commodo. Id ornare arcu odio ut sem nulla pharetra diam sit.\n\nEst ullamcorper eget nulla facilisi etiam dignissim diam quis enim. Sagittis vitae et leo duis ut diam quam nulla. Elementum nisi quis eleifend quam. Congue mauris rhoncus aenean vel elit. Adipiscing elit duis tristique sollicitudin nibh sit. Egestas egestas fringilla phasellus faucibus scelerisque. Morbi tincidunt augue interdum velit euismod. Massa sed elementum tempus egestas sed sed. Id leo in vitae turpis massa sed elementum tempus egestas. In pellentesque massa placerat duis ultricies lacus sed turpis. Vitae proin sagittis nisl rhoncus mattis rhoncus. Enim tortor at auctor urna nunc id. In fermentum posuere urna nec tincidunt praesent semper feugiat nibh. Aliquam ut porttitor leo a diam sollicitudin tempor id. Pellentesque elit eget gravida cum sociis natoque. Molestie at elementum eu facilisis sed odio morbi quis. Tristique senectus et netus et malesuada fames ac turpis. Proin libero nunc consequat interdum varius sit amet mattis. Pellentesque id nibh tortor id.\n\nRisus sed vulputate odio ut enim blandit. Laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt eget. Morbi tincidunt augue interdum velit euismod in pellentesque. Pharetra pharetra massa massa ultricies mi quis hendrerit. Nunc aliquet bibendum enim facilisis gravida neque. Feugiat sed lectus vestibulum mattis ullamcorper velit sed ullamcorper. Risus quis varius quam quisque id diam vel. Et ultrices neque ornare aenean. Aliquet sagittis id consectetur purus ut faucibus pulvinar elementum. Nibh ipsum consequat nisl vel. Mauris rhoncus aenean vel elit scelerisque mauris pellentesque pulvinar. Ornare quam viverra orci sagittis eu volutpat odio facilisis. Euismod nisi porta lorem mollis aliquam. Enim ut tellus elementum sagittis. Rhoncus mattis rhoncus urna neque. Malesuada fames ac turpis egestas. Cursus in hac habitasse platea dictumst quisque sagittis. Sit amet aliquam id diam maecenas ultricies mi eget mauris.\n\nEnim sit amet venenatis urna cursus eget nunc. Fermentum odio eu feugiat pretium nibh ipsum consequat. Eu scelerisque felis imperdiet proin. Nullam non nisi est sit amet facilisis magna etiam tempor. In mollis nunc sed id semper risus in hendrerit. Sollicitudin nibh sit amet commodo nulla facilisi nullam. Sit amet nisl purus in mollis nunc sed id. Nam libero justo laoreet sit amet cursus sit amet dictum. Condimentum id venenatis a condimentum vitae sapien pellentesque. Porta nibh venenatis cras sed felis. Lectus nulla at volutpat diam ut venenatis tellus in. Aliquam etiam erat velit scelerisque in dictum non consectetur a. Leo vel fringilla est ullamcorper eget. Sodales ut etiam sit amet nisl purus in mollis nunc. Euismod nisi porta lorem mollis aliquam. Ornare arcu odio ut sem nulla. Sed felis eget velit aliquet sagittis id consectetur. Pellentesque nec nam aliquam sem et tortor consequat id. Enim nec dui nunc mattis enim ut tellus elementum.\n\nNullam non nisi est sit amet facilisis magna. Rutrum quisque non tellus orci ac auctor augue. Nunc vel risus commodo viverra maecenas accumsan lacus. Viverra vitae congue eu consequat. Sollicitudin nibh sit amet commodo nulla. Amet volutpat consequat mauris nunc congue nisi. Maecenas pharetra convallis posuere morbi leo urna molestie at. Mattis vulputate enim nulla aliquet porttitor lacus luctus accumsan tortor. Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc consequat. Adipiscing diam donec adipiscing tristique risus. Elementum curabitur vitae nunc sed velit dignissim sodales ut. Eleifend donec pretium vulputate sapien nec. Commodo quis imperdiet massa tincidunt nunc pulvinar. Proin libero nunc consequat interdum varius sit amet mattis. Facilisis gravida neque convallis a cras semper auctor neque vitae. Quisque egestas diam in arcu cursus. Nunc eget lorem dolor sed viverra ipsum. Mauris sit amet massa vitae tortor condimentum lacinia quis vel.\n\nAliquam sem et tortor consequat id porta nibh venenatis cras. Nunc sed id semper risus in. Enim sed faucibus turpis in eu mi bibendum neque. Molestie nunc non blandit massa enim. Enim praesent elementum facilisis leo vel fringilla est ullamcorper. Semper risus in hendrerit gravida rutrum quisque non tellus orci. Ac turpis egestas maecenas pharetra. In nulla posuere sollicitudin aliquam. Justo nec ultrices dui sapien eget mi proin sed libero. In ornare quam viverra orci sagittis eu. Proin nibh nisl condimentum id venenatis. Morbi enim nunc faucibus a pellentesque sit amet porttitor eget. Quis risus sed vulputate odio ut enim blandit. Risus feugiat in ante metus dictum at tempor commodo. Sodales neque sodales ut etiam. Nunc id cursus metus aliquam.\n\nGravida dictum fusce ut placerat orci nulla pellentesque dignissim enim. Augue ut lectus arcu bibendum at. Quis varius quam quisque id diam vel quam. Egestas congue quisque egestas diam in arcu. Condimentum mattis pellentesque id nibh tortor id aliquet lectus. Enim lobortis scelerisque fermentum dui faucibus in. In tellus integer feugiat scelerisque varius morbi enim nunc. Mattis molestie a iaculis at erat pellentesque. Elit scelerisque mauris pellentesque pulvinar pellentesque habitant morbi tristique. Lorem ipsum dolor sit amet consectetur adipiscing elit ut aliquam. Nisl rhoncus mattis rhoncus urna neque. Ac auctor augue mauris augue neque gravida in fermentum et. Sodales ut eu sem integer vitae justo eget. Sed egestas egestas fringilla phasellus.\n\nViverra adipiscing at in tellus integer feugiat scelerisque varius. Purus gravida quis blandit turpis. Id porta nibh venenatis cras sed. Mattis vulputate enim nulla aliquet porttitor lacus. Augue eget arcu dictum varius duis at consectetur lorem donec. Nulla at volutpat diam ut venenatis tellus in metus. Aliquam etiam erat velit scelerisque in dictum non consectetur. Turpis cursus in hac habitasse platea dictumst. Consequat mauris nunc congue nisi vitae suscipit tellus. Volutpat maecenas volutpat blandit aliquam etiam. Massa massa ultricies mi quis hendrerit dolor magna eget est. Velit egestas dui id ornare arcu. Non consectetur a erat nam at. Orci sagittis eu volutpat odio facilisis mauris sit amet. Dui id ornare arcu odio. Sed arcu non odio euismod lacinia.\n\nFeugiat in ante metus dictum. Gravida arcu ac tortor dignissim convallis. Egestas sed tempus urna et pharetra pharetra massa massa. Nulla facilisi nullam vehicula ipsum a arcu. Ipsum a arcu cursus vitae congue mauris. Porttitor rhoncus dolor purus non. Magna sit amet purus gravida quis blandit. Sapien eget mi proin sed libero enim sed faucibus turpis. Nisl nunc mi ipsum faucibus vitae aliquet nec ullamcorper sit. Pellentesque dignissim enim sit amet venenatis urna cursus eget. Pharetra massa massa ultricies mi quis hendrerit. Sapien nec sagittis aliquam malesuada bibendum. Nunc scelerisque viverra mauris in aliquam sem fringilla ut. Dolor magna eget est lorem ipsum dolor. Amet commodo nulla facilisi nullam. Pellentesque elit ullamcorper dignissim cras. Id porta nibh venenatis cras sed felis eget. Nam at lectus urna duis.\n\nLaoreet non curabitur gravida arcu ac tortor dignissim convallis. Nunc lobortis mattis aliquam faucibus purus in massa tempor. Sit amet luctus venenatis lectus magna fringilla. Duis ultricies lacus sed turpis tincidunt id. Sed velit dignissim sodales ut eu. Ut tortor pretium viverra suspendisse potenti nullam. Iaculis at erat pellentesque adipiscing. Ipsum nunc aliquet bibendum enim facilisis gravida neque. Nulla aliquet enim tortor at auctor urna nunc id cursus. Amet cursus sit amet dictum sit amet justo donec enim.\n\nEnim nunc faucibus a pellentesque sit amet porttitor eget dolor. Pharetra magna ac placerat vestibulum lectus mauris ultrices eros in. Nulla facilisi etiam dignissim diam quis enim. Ut enim blandit volutpat maecenas volutpat blandit aliquam etiam erat. Imperdiet proin fermentum leo vel orci porta non pulvinar neque. Vel fringilla est ullamcorper eget nulla. Bibendum neque egestas congue quisque egestas diam in arcu cursus. Ipsum nunc aliquet bibendum enim facilisis gravida neque convallis a. Arcu cursus vitae congue mauris rhoncus aenean vel elit. Augue eget arcu dictum varius duis. Tristique et egestas quis ipsum. Quis varius quam quisque id. Varius sit amet mattis vulputate. Mattis molestie a iaculis at erat pellentesque. Libero justo laoreet sit amet cursus. Aliquam id diam maecenas ultricies mi eget mauris pharetra. Ut eu sem integer vitae justo eget. Fames ac turpis egestas sed. Suspendisse in est ante in nibh mauris cursus mattis.\n\nFaucibus pulvinar elementum integer enim neque volutpat ac tincidunt vitae. Neque vitae tempus quam pellentesque nec nam aliquam. Lobortis elementum nibh tellus molestie nunc non. Lacus vel facilisis volutpat est velit egestas dui. Justo laoreet sit amet cursus sit amet dictum sit amet. Adipiscing enim eu turpis egestas pretium aenean pharetra magna. Cursus metus aliquam eleifend mi in nulla posuere. Nibh mauris cursus mattis molestie a. Dignissim diam quis enim lobortis scelerisque fermentum. A scelerisque purus semper eget duis at tellus. Lacus sed turpis tincidunt id aliquet risus feugiat in. Non tellus orci ac auctor. Ultrices in iaculis nunc sed augue lacus. Tincidunt tortor aliquam nulla facilisi cras.\n\nNulla facilisi nullam vehicula ipsum a arcu cursus vitae congue. Eget magna fermentum iaculis eu non diam phasellus. Pharetra massa massa ultricies mi quis. Eget mauris pharetra et ultrices neque ornare. Aliquam faucibus purus in massa. Facilisi morbi tempus iaculis urna id volutpat lacus. Accumsan lacus vel facilisis volutpat. Curabitur gravida arcu ac tortor. Quam lacus suspendisse faucibus interdum. Elementum nibh tellus molestie nunc non blandit massa enim. Libero id faucibus nisl tincidunt. Bibendum ut tristique et egestas. Ut diam quam nulla porttitor massa id neque aliquam vestibulum. Augue interdum velit euismod in pellentesque. Adipiscing diam donec adipiscing tristique risus nec feugiat. Fringilla ut morbi tincidunt augue interdum velit. Vitae et leo duis ut diam quam nulla porttitor massa.\n\nEgestas integer eget aliquet nibh praesent tristique. Posuere sollicitudin aliquam ultrices sagittis orci a. Nisi est sit amet facilisis. Risus quis varius quam quisque id diam. Faucibus turpis in eu mi. Et molestie ac feugiat sed lectus vestibulum. Porttitor lacus luctus accumsan tortor posuere ac. Platea dictumst vestibulum rhoncus est pellentesque. Tortor pretium viverra suspendisse potenti nullam ac tortor. Enim praesent elementum facilisis leo vel fringilla est. Proin libero nunc consequat interdum varius sit amet mattis vulputate. Turpis egestas pretium aenean pharetra magna ac placerat vestibulum lectus. Nulla pharetra diam sit amet nisl suscipit. Mauris nunc congue nisi vitae suscipit tellus mauris a diam. Faucibus in ornare quam viverra orci sagittis eu volutpat. Volutpat consequat mauris nunc congue nisi vitae. Dui nunc mattis enim ut tellus. Adipiscing elit ut aliquam purus sit amet luctus.\n\nTempus egestas sed sed risus. Scelerisque fermentum dui faucibus in ornare quam viverra orci. Massa ultricies mi quis hendrerit dolor magna eget. Pulvinar mattis nunc sed blandit libero volutpat sed cras ornare. Ut eu sem integer vitae justo eget magna fermentum. Ornare quam viverra orci sagittis. Eget dolor morbi non arcu risus quis varius quam. Tincidunt praesent semper feugiat nibh sed pulvinar. Sit amet justo donec enim diam vulputate. Dui faucibus in ornare quam viverra. Tincidunt tortor aliquam nulla facilisi cras fermentum odio eu. Turpis egestas sed tempus urna et. Pretium quam vulputate dignissim suspendisse in est ante in.\n\nMorbi quis commodo odio aenean sed adipiscing diam donec. Nunc mattis enim ut tellus elementum sagittis vitae et. Diam vel quam elementum pulvinar etiam non quam. Convallis posuere morbi leo urna molestie at elementum eu. Adipiscing at in tellus integer feugiat scelerisque varius morbi. Quis varius quam quisque id diam vel quam elementum. Dui accumsan sit amet nulla. Adipiscing elit duis tristique sollicitudin nibh sit amet commodo. Viverra ipsum nunc aliquet bibendum enim facilisis. Porta lorem mollis aliquam ut. Velit ut tortor pretium viverra suspendisse potenti. Quis viverra nibh cras pulvinar mattis nunc sed blandit. Pharetra magna ac placerat vestibulum. Mauris ultrices eros in cursus turpis massa.\n\nLacus vestibulum sed arcu non odio euismod lacinia at. Dapibus ultrices in iaculis nunc sed. Cras adipiscing enim eu turpis egestas. Eget arcu dictum varius duis at consectetur. Consequat id porta nibh venenatis cras sed felis eget velit. Integer enim neque volutpat ac tincidunt vitae. Feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Ut morbi tincidunt augue interdum velit euismod. Sed cras ornare arcu dui vivamus arcu felis bibendum ut. Eget felis eget nunc lobortis mattis aliquam faucibus purus in. Luctus venenatis lectus magna fringilla urna porttitor rhoncus dolor. Nisl nunc mi ipsum faucibus vitae. Proin fermentum leo vel orci porta. Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Et leo duis ut diam quam. Eros in cursus turpis massa tincidunt. Volutpat est velit egestas dui id. Commodo odio aenean sed adipiscing diam. Quis blandit turpis cursus in hac habitasse platea dictumst quisque. Magna fringilla urna porttitor rhoncus dolor.\n\nAmet consectetur adipiscing elit ut aliquam purus sit amet. Vitae justo eget magna fermentum iaculis eu non diam. Hendrerit dolor magna eget est. Ac placerat vestibulum lectus mauris ultrices eros in cursus turpis. Egestas diam in arcu cursus. At varius vel pharetra vel turpis nunc. Lacus vel facilisis volutpat est velit. Ut ornare lectus sit amet est placerat in egestas. Quam adipiscing vitae proin sagittis nisl rhoncus. Dolor purus non enim praesent. Urna condimentum mattis pellentesque id. Magnis dis parturient montes nascetur ridiculus. Feugiat nisl pretium fusce id. Sed cras ornare arcu dui vivamus. Vitae turpis massa sed elementum tempus egestas sed sed. Ac feugiat sed lectus vestibulum mattis ullamcorper velit sed ullamcorper. Ac ut consequat semper viverra nam libero. Consectetur lorem donec massa sapien faucibus. Purus viverra accumsan in nisl nisi scelerisque eu ultrices.\n\nEu turpis egestas pretium aenean pharetra. Nisl rhoncus mattis rhoncus urna neque viverra justo nec ultrices. Pellentesque sit amet porttitor eget dolor morbi non arcu. Vitae justo eget magna fermentum iaculis. Quis auctor elit sed vulputate mi sit. Purus viverra accumsan in nisl nisi scelerisque eu ultrices. Semper auctor neque vitae tempus quam pellentesque nec nam. Rhoncus dolor purus non enim. Sed turpis tincidunt id aliquet risus feugiat. Sit amet justo donec enim diam vulputate ut pharetra sit. Risus pretium quam vulputate dignissim suspendisse in est ante in. Massa sapien faucibus et molestie ac feugiat. Id aliquet risus feugiat in ante metus. Risus ultricies tristique nulla aliquet enim tortor at auctor urna. Sed lectus vestibulum mattis ullamcorper velit sed ullamcorper morbi.\n\nLacus sed turpis tincidunt id aliquet risus feugiat in. Risus ultricies tristique nulla aliquet enim tortor. In ornare quam viverra orci sagittis eu volutpat. Netus et malesuada fames ac turpis egestas sed tempus urna. Fames ac turpis egestas maecenas pharetra convallis posuere morbi. Etiam erat velit scelerisque in dictum non. Cursus turpis massa tincidunt dui ut ornare lectus. Tristique sollicitudin nibh sit amet commodo nulla facilisi. Pellentesque pulvinar pellentesque habitant morbi tristique senectus et. Aliquet eget sit amet tellus cras. Nullam ac tortor vitae purus faucibus ornare. Lacus viverra vitae congue eu consequat. Vulputate ut pharetra sit amet. Est ante in nibh mauris cursus mattis molestie a. Ipsum suspendisse ultrices gravida dictum fusce ut placerat orci.\n\nEt tortor at risus viverra. Sed libero enim sed faucibus turpis in eu. Id cursus metus aliquam eleifend mi in nulla posuere sollicitudin. Risus viverra adipiscing at in. Imperdiet massa tincidunt nunc pulvinar sapien et. Nec feugiat in fermentum posuere urna nec tincidunt. Ultricies mi eget mauris pharetra et. Morbi tristique senectus et netus et malesuada fames ac. At quis risus sed vulputate. Interdum velit laoreet id donec. Sapien pellentesque habitant morbi tristique. Pharetra vel turpis nunc eget lorem dolor sed viverra. In massa tempor nec feugiat nisl. Massa tincidunt nunc pulvinar sapien et ligula ullamcorper malesuada proin. Mauris augue neque gravida in.\n\nFaucibus vitae aliquet nec ullamcorper sit amet risus. Id velit ut tortor pretium viverra suspendisse potenti. Leo integer malesuada nunc vel risus commodo viverra maecenas. Risus quis varius quam quisque id. Aliquam malesuada bibendum arcu vitae elementum curabitur vitae. Vestibulum lectus mauris ultrices eros in cursus turpis. Fermentum posuere urna nec tincidunt. Magna etiam tempor orci eu lobortis elementum nibh tellus molestie. Id ornare arcu odio ut. Facilisi nullam vehicula ipsum a arcu cursus vitae congue. Nulla pellentesque dignissim enim sit amet venenatis urna cursus eget. Viverra mauris in aliquam sem fringilla ut morbi tincidunt. Quis ipsum suspendisse ultrices gravida dictum fusce ut placerat orci. Sed cras ornare arcu dui vivamus arcu felis. Egestas diam in arcu cursus euismod quis.\n\nTincidunt dui ut ornare lectus. Morbi tristique senectus et netus et. Ornare arcu dui vivamus arcu felis bibendum ut tristique. Habitant morbi tristique senectus et netus et malesuada fames ac. Ut tristique et egestas quis. Mollis aliquam ut porttitor leo. Venenatis tellus in metus vulputate eu scelerisque felis imperdiet proin. Sagittis eu volutpat odio facilisis mauris sit amet massa. Eu facilisis sed odio morbi. Nunc consequat interdum varius sit amet mattis. Velit dignissim sodales ut eu. Pellentesque eu tincidunt tortor aliquam. Porta lorem mollis aliquam ut porttitor. Rhoncus urna neque viverra justo nec ultrices. Viverra suspendisse potenti nullam ac tortor vitae purus. Fermentum posuere urna nec tincidunt praesent semper feugiat nibh sed. Purus sit amet luctus venenatis lectus magna fringilla urna porttitor. Sed lectus vestibulum mattis ullamcorper velit sed ullamcorper. Nulla posuere sollicitudin aliquam ultrices sagittis orci a scelerisque. Nisl nisi scelerisque eu ultrices vitae auctor.\n\nIn vitae turpis massa sed elementum tempus egestas. Cursus sit amet dictum sit amet justo donec enim. Vitae congue eu consequat ac felis donec et. Augue interdum velit euismod in pellentesque massa placerat. Enim ut sem viverra aliquet eget sit amet. Velit scelerisque in dictum non consectetur a erat. Sed lectus vestibulum mattis ullamcorper velit sed ullamcorper. Nunc faucibus a pellentesque sit amet porttitor eget. Tellus integer feugiat scelerisque varius morbi. Lorem sed risus ultricies tristique nulla aliquet enim tortor at. Eget nulla facilisi etiam dignissim diam quis enim lobortis scelerisque. Adipiscing elit duis tristique sollicitudin. Adipiscing elit pellentesque habitant morbi tristique. Ac tincidunt vitae semper quis lectus nulla at.\n\nMaecenas sed enim ut sem viverra. Erat pellentesque adipiscing commodo elit at imperdiet. Dolor morbi non arcu risus quis varius quam quisque. Fringilla urna porttitor rhoncus dolor purus non enim praesent. Tellus integer feugiat scelerisque varius morbi enim nunc faucibus a. Felis eget nunc lobortis mattis aliquam faucibus purus in. Fringilla phasellus faucibus scelerisque eleifend. Pulvinar etiam non quam lacus suspendisse faucibus interdum posuere. Risus ultricies tristique nulla aliquet. Lectus sit amet est placerat. Ac ut consequat semper viverra nam libero justo. Dapibus ultrices in iaculis nunc sed augue. Mattis ullamcorper velit sed ullamcorper. Eget nullam non nisi est. Vitae elementum curabitur vitae nunc sed velit.\n\nSit amet commodo nulla facilisi nullam vehicula ipsum a arcu. Tempor nec feugiat nisl pretium fusce id velit ut. Nulla pellentesque dignissim enim sit amet venenatis. Sed tempus urna et pharetra pharetra. Congue quisque egestas diam in. Convallis posuere morbi leo urna. Nec tincidunt praesent semper feugiat nibh sed pulvinar proin gravida. Sagittis nisl rhoncus mattis rhoncus urna neque viverra justo. Scelerisque felis imperdiet proin fermentum leo vel. Ut placerat orci nulla pellentesque dignissim enim sit amet. In cursus turpis massa tincidunt dui. Rutrum quisque non tellus orci ac auctor augue mauris augue. Cursus vitae congue mauris rhoncus aenean vel elit scelerisque mauris.\n\nScelerisque fermentum dui faucibus in ornare quam viverra orci. Habitant morbi tristique senectus et netus et. Ridiculus mus mauris vitae ultricies leo. Vitae semper quis lectus nulla at volutpat diam. Purus faucibus ornare suspendisse sed nisi. Enim lobortis scelerisque fermentum dui faucibus in ornare quam. Mi tempus imperdiet nulla malesuada pellentesque elit eget. Varius duis at consectetur lorem donec. Pulvinar pellentesque habitant morbi tristique senectus et netus et. A iaculis at erat pellentesque adipiscing commodo elit at imperdiet.\n\nMi ipsum faucibus vitae aliquet nec. Libero volutpat sed cras ornare arcu dui vivamus arcu. Natoque penatibus et magnis dis parturient montes nascetur ridiculus. Maecenas volutpat blandit aliquam etiam erat velit scelerisque. Cras adipiscing enim eu turpis. Nec tincidunt praesent semper feugiat nibh sed pulvinar. Justo laoreet sit amet cursus sit amet dictum sit. Velit scelerisque in dictum non consectetur a erat nam. Turpis tincidunt id aliquet risus feugiat in ante. Aliquet risus feugiat in ante metus dictum. Hac habitasse platea dictumst quisque sagittis purus sit. Et pharetra pharetra massa massa ultricies. Sit amet nisl suscipit adipiscing bibendum est ultricies integer. Venenatis urna cursus eget nunc scelerisque viverra mauris in. Integer quis auctor elit sed. In est ante in nibh mauris cursus mattis molestie. Scelerisque in dictum non consectetur a erat nam at.\n\nLectus sit amet est placerat in. Sit amet cursus sit amet. Nibh nisl condimentum id venenatis a condimentum. Purus ut faucibus pulvinar elementum integer enim. Pharetra sit amet aliquam id diam maecenas. Id cursus metus aliquam eleifend mi in nulla posuere. Lobortis mattis aliquam faucibus purus in massa tempor nec. Urna neque viverra justo nec ultrices dui sapien eget. Enim ut sem viverra aliquet eget sit amet. In eu mi bibendum neque egestas congue quisque egestas. Enim neque volutpat ac tincidunt. Orci ac auctor augue mauris augue neque gravida in fermentum. Velit aliquet sagittis id consectetur. Enim ut sem viverra aliquet eget sit amet tellus.\n\nSemper auctor neque vitae tempus quam pellentesque nec. Non blandit massa enim nec dui nunc. Morbi blandit cursus risus at ultrices mi tempus imperdiet nulla. Arcu non odio euismod lacinia at quis risus. Dictum varius duis at consectetur lorem donec massa. Blandit massa enim nec dui. Nibh ipsum consequat nisl vel. Turpis in eu mi bibendum neque. Ut tristique et egestas quis. Ac odio tempor orci dapibus. Gravida dictum fusce ut placerat orci nulla pellentesque dignissim. Integer feugiat scelerisque varius morbi enim. Libero volutpat sed cras ornare arcu dui. Odio aenean sed adipiscing diam. Et egestas quis ipsum suspendisse ultrices. Aliquet lectus proin nibh nisl condimentum. Sit amet consectetur adipiscing elit duis tristique sollicitudin nibh sit. Blandit massa enim nec dui. Tellus molestie nunc non blandit massa enim nec. Tortor vitae purus faucibus ornare suspendisse sed nisi.\n\nNascetur ridiculus mus mauris vitae ultricies leo. Elementum facilisis leo vel fringilla est ullamcorper eget nulla. Diam maecenas ultricies mi eget. Duis tristique sollicitudin nibh sit amet commodo nulla. Tempus iaculis urna id volutpat lacus laoreet non curabitur gravida. Dictumst quisque sagittis purus sit amet. Viverra mauris in aliquam sem. Quis risus sed vulputate odio ut enim blandit volutpat maecenas. Condimentum mattis pellentesque id nibh tortor id. Non sodales neque sodales ut etiam sit amet. Ipsum consequat nisl vel pretium. Cursus in hac habitasse platea dictumst quisque sagittis purus sit. Fringilla est ullamcorper eget nulla facilisi etiam. Tellus elementum sagittis vitae et leo duis ut diam quam. Nisl vel pretium lectus quam id leo in."}}
diff --git a/tests/data/valid/toml-lang-compliance/valid/qa/qa-scalar-string-multiline-40kb.toml b/tests/data/valid/toml-lang-compliance/valid/qa/qa-scalar-string-multiline-40kb.toml
new file mode 100644
index 0000000..e7b4629
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/qa/qa-scalar-string-multiline-40kb.toml
@@ -0,0 +1,99 @@
+long = '''Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Quam lacus suspendisse faucibus interdum posuere lorem ipsum dolor. Amet consectetur adipiscing elit ut. Nulla facilisi etiam dignissim diam quis enim lobortis. Curabitur vitae nunc sed velit dignissim sodales ut eu. Fames ac turpis egestas sed tempus urna et. Facilisi cras fermentum odio eu feugiat pretium. Nec tincidunt praesent semper feugiat nibh sed pulvinar proin gravida. Est lorem ipsum dolor sit amet consectetur adipiscing elit. Vel quam elementum pulvinar etiam non quam lacus. Pharetra et ultrices neque ornare aenean euismod. Nisl nisi scelerisque eu ultrices. Eget dolor morbi non arcu risus. Bibendum neque egestas congue quisque egestas diam in arcu cursus. Faucibus nisl tincidunt eget nullam. Nisl pretium fusce id velit ut tortor pretium viverra suspendisse. Mauris ultrices eros in cursus. Donec ac odio tempor orci dapibus ultrices in iaculis. Tellus cras adipiscing enim eu turpis egestas pretium aenean pharetra.
+
+Eros in cursus turpis massa. Nascetur ridiculus mus mauris vitae ultricies leo integer malesuada nunc. Velit sed ullamcorper morbi tincidunt ornare massa eget egestas purus. Aenean euismod elementum nisi quis eleifend quam. Magnis dis parturient montes nascetur ridiculus mus. Eu tincidunt tortor aliquam nulla facilisi cras. Tristique senectus et netus et malesuada fames. Urna nec tincidunt praesent semper feugiat nibh sed pulvinar. Vitae ultricies leo integer malesuada nunc vel risus commodo viverra. Ac turpis egestas sed tempus urna et. Amet mauris commodo quis imperdiet massa tincidunt. Urna nunc id cursus metus aliquam eleifend mi. In nulla posuere sollicitudin aliquam ultrices sagittis orci a scelerisque. Neque aliquam vestibulum morbi blandit cursus. Pulvinar mattis nunc sed blandit libero volutpat sed. Sed egestas egestas fringilla phasellus faucibus scelerisque eleifend donec pretium.
+
+Blandit cursus risus at ultrices mi tempus. Turpis massa sed elementum tempus egestas sed sed. Dictum varius duis at consectetur lorem. Commodo ullamcorper a lacus vestibulum sed arcu non. Dolor magna eget est lorem. Tincidunt arcu non sodales neque sodales ut etiam sit amet. Sit amet risus nullam eget felis eget nunc lobortis. Risus in hendrerit gravida rutrum quisque non tellus orci. Elementum pulvinar etiam non quam lacus suspendisse faucibus. Morbi tristique senectus et netus et malesuada. In aliquam sem fringilla ut morbi tincidunt. Ornare aenean euismod elementum nisi quis eleifend quam. Sed id semper risus in hendrerit gravida rutrum quisque. Lorem ipsum dolor sit amet consectetur adipiscing elit. A condimentum vitae sapien pellentesque habitant morbi tristique senectus et. Faucibus purus in massa tempor nec feugiat nisl. Vehicula ipsum a arcu cursus vitae congue. Facilisi cras fermentum odio eu feugiat pretium nibh. Viverra mauris in aliquam sem fringilla ut morbi tincidunt. Ultrices dui sapien eget mi proin sed libero enim.
+
+Nisi est sit amet facilisis magna etiam tempor. Posuere ac ut consequat semper viverra nam. Dis parturient montes nascetur ridiculus mus mauris vitae. Nec sagittis aliquam malesuada bibendum. Mattis pellentesque id nibh tortor id aliquet lectus. Vitae congue eu consequat ac felis donec et. Cras sed felis eget velit aliquet sagittis id consectetur purus. Pellentesque elit ullamcorper dignissim cras tincidunt. Pellentesque dignissim enim sit amet venenatis urna. A cras semper auctor neque vitae tempus. Amet massa vitae tortor condimentum lacinia quis vel eros donec. Tempor commodo ullamcorper a lacus. Nibh tellus molestie nunc non blandit massa enim nec dui. Viverra orci sagittis eu volutpat odio facilisis mauris sit. Sed augue lacus viverra vitae. Vulputate eu scelerisque felis imperdiet proin fermentum leo vel orci. Tellus rutrum tellus pellentesque eu tincidunt tortor.
+
+Cras semper auctor neque vitae tempus quam pellentesque nec. Lorem ipsum dolor sit amet consectetur adipiscing elit ut aliquam. Tristique magna sit amet purus gravida quis blandit turpis. Viverra ipsum nunc aliquet bibendum. Arcu bibendum at varius vel. Amet mattis vulputate enim nulla. Vulputate enim nulla aliquet porttitor. Volutpat blandit aliquam etiam erat velit scelerisque in dictum. Morbi tristique senectus et netus et malesuada fames ac. Faucibus et molestie ac feugiat sed.
+
+Tellus elementum sagittis vitae et leo duis. Id aliquet lectus proin nibh. Ornare arcu dui vivamus arcu. Morbi tincidunt augue interdum velit euismod in pellentesque massa placerat. Quis eleifend quam adipiscing vitae. Tristique senectus et netus et malesuada fames ac turpis. Pharetra convallis posuere morbi leo. Ornare arcu odio ut sem nulla pharetra diam sit. Morbi tristique senectus et netus et. Dictum non consectetur a erat nam at lectus urna.
+
+Varius vel pharetra vel turpis. Mi ipsum faucibus vitae aliquet. Tellus in metus vulputate eu scelerisque felis imperdiet proin. In est ante in nibh mauris cursus mattis. Massa ultricies mi quis hendrerit dolor magna eget. Fermentum leo vel orci porta. Elit ut aliquam purus sit amet luctus venenatis lectus. Eget aliquet nibh praesent tristique magna sit amet. Arcu non odio euismod lacinia at quis. Montes nascetur ridiculus mus mauris vitae ultricies. Tempus quam pellentesque nec nam aliquam sem et tortor. Morbi leo urna molestie at elementum eu facilisis sed.
+
+In fermentum posuere urna nec tincidunt. Neque aliquam vestibulum morbi blandit cursus risus. Vulputate dignissim suspendisse in est ante in nibh mauris cursus. Lorem ipsum dolor sit amet consectetur adipiscing. Orci eu lobortis elementum nibh tellus molestie nunc non. Enim diam vulputate ut pharetra sit amet aliquam. Convallis convallis tellus id interdum velit laoreet id donec ultrices. Sit amet mattis vulputate enim nulla aliquet porttitor lacus luctus. A lacus vestibulum sed arcu non odio. Ut tortor pretium viverra suspendisse potenti nullam ac tortor. Diam vel quam elementum pulvinar etiam non quam. Viverra justo nec ultrices dui. Eu volutpat odio facilisis mauris sit amet massa. Sed ullamcorper morbi tincidunt ornare massa eget egestas purus. Ac felis donec et odio pellentesque. Nisl vel pretium lectus quam id leo in. Ultricies lacus sed turpis tincidunt id.
+
+At urna condimentum mattis pellentesque id nibh tortor id. Sem nulla pharetra diam sit amet nisl suscipit. Neque viverra justo nec ultrices. Arcu cursus euismod quis viverra nibh cras pulvinar. Dolor sit amet consectetur adipiscing elit ut aliquam purus. Id diam vel quam elementum pulvinar etiam non. Elementum pulvinar etiam non quam lacus suspendisse faucibus. Id aliquet lectus proin nibh nisl condimentum id venenatis. Sit amet consectetur adipiscing elit duis tristique sollicitudin nibh. Sed faucibus turpis in eu mi bibendum neque egestas congue. Consectetur libero id faucibus nisl tincidunt eget nullam. At volutpat diam ut venenatis tellus in metus vulputate eu. Condimentum lacinia quis vel eros donec ac odio. Sit amet porttitor eget dolor morbi non arcu risus quis. Viverra mauris in aliquam sem fringilla ut morbi tincidunt. Metus dictum at tempor commodo ullamcorper. At ultrices mi tempus imperdiet nulla. Est ullamcorper eget nulla facilisi etiam dignissim diam quis. Lobortis elementum nibh tellus molestie nunc non. Placerat in egestas erat imperdiet sed.
+
+Placerat in egestas erat imperdiet sed euismod. Lobortis feugiat vivamus at augue eget arcu dictum varius. Ut sem nulla pharetra diam sit amet. Et tortor at risus viverra adipiscing at in. Tempor nec feugiat nisl pretium. Cursus euismod quis viverra nibh. Eget mi proin sed libero enim sed. Aliquam id diam maecenas ultricies. Mi tempus imperdiet nulla malesuada pellentesque elit eget. Gravida quis blandit turpis cursus in hac habitasse platea dictumst. Sed tempus urna et pharetra pharetra massa massa. Dolor purus non enim praesent elementum facilisis leo vel.
+
+Pharetra vel turpis nunc eget. Quam pellentesque nec nam aliquam sem et tortor consequat id. Orci eu lobortis elementum nibh tellus molestie nunc non. Porttitor leo a diam sollicitudin tempor id. Tincidunt ornare massa eget egestas purus viverra accumsan in nisl. Quam lacus suspendisse faucibus interdum posuere lorem ipsum dolor sit. Elit ut aliquam purus sit amet luctus venenatis lectus. Velit egestas dui id ornare arcu odio ut sem nulla. Lacus viverra vitae congue eu consequat ac felis donec. Nulla aliquet porttitor lacus luctus accumsan tortor posuere ac ut. Lorem dolor sed viverra ipsum. Blandit libero volutpat sed cras ornare arcu. Egestas erat imperdiet sed euismod nisi porta lorem mollis. Viverra maecenas accumsan lacus vel. Enim neque volutpat ac tincidunt. Porttitor massa id neque aliquam vestibulum morbi blandit cursus risus. Malesuada bibendum arcu vitae elementum curabitur vitae nunc.
+
+Et malesuada fames ac turpis egestas integer. Egestas egestas fringilla phasellus faucibus scelerisque eleifend donec pretium. Est placerat in egestas erat imperdiet sed. Non arcu risus quis varius quam quisque. Lorem mollis aliquam ut porttitor leo a. Viverra tellus in hac habitasse platea dictumst vestibulum rhoncus. Fermentum iaculis eu non diam. Erat imperdiet sed euismod nisi porta lorem mollis aliquam. Varius vel pharetra vel turpis nunc eget lorem dolor. Rhoncus mattis rhoncus urna neque viverra. Hac habitasse platea dictumst quisque sagittis purus sit. At quis risus sed vulputate odio ut enim. Pharetra magna ac placerat vestibulum lectus mauris ultrices eros. Rutrum quisque non tellus orci ac auctor. Iaculis eu non diam phasellus vestibulum lorem sed. Ut sem nulla pharetra diam sit amet nisl suscipit. Risus at ultrices mi tempus. Vitae tortor condimentum lacinia quis vel eros donec. Sed tempus urna et pharetra. Posuere sollicitudin aliquam ultrices sagittis orci.
+
+Congue quisque egestas diam in arcu. Hac habitasse platea dictumst vestibulum rhoncus est pellentesque elit. Pellentesque habitant morbi tristique senectus et netus et. Id interdum velit laoreet id. Fusce ut placerat orci nulla pellentesque dignissim. Pretium nibh ipsum consequat nisl vel pretium. Etiam erat velit scelerisque in dictum non consectetur a. Turpis in eu mi bibendum neque egestas congue quisque egestas. Pulvinar sapien et ligula ullamcorper malesuada. Ultricies tristique nulla aliquet enim tortor at. Suspendisse interdum consectetur libero id faucibus. Lorem sed risus ultricies tristique nulla aliquet. Tristique senectus et netus et malesuada fames. Eu augue ut lectus arcu bibendum at varius vel. Egestas sed tempus urna et pharetra pharetra massa massa ultricies. Aliquet eget sit amet tellus cras adipiscing. Massa placerat duis ultricies lacus sed turpis tincidunt id aliquet. Ornare massa eget egestas purus viverra accumsan in nisl. Justo laoreet sit amet cursus sit amet.
+
+In metus vulputate eu scelerisque felis imperdiet proin. At erat pellentesque adipiscing commodo elit at. Ipsum suspendisse ultrices gravida dictum fusce. Lectus sit amet est placerat in egestas erat. Aliquam ultrices sagittis orci a. Sagittis id consectetur purus ut faucibus pulvinar elementum. Ornare arcu odio ut sem nulla pharetra diam. Sit amet purus gravida quis blandit turpis cursus. Duis ultricies lacus sed turpis tincidunt. Malesuada fames ac turpis egestas sed tempus urna et. Viverra ipsum nunc aliquet bibendum enim facilisis. Et pharetra pharetra massa massa ultricies mi quis. Eget duis at tellus at urna condimentum mattis. Euismod in pellentesque massa placerat. Enim nunc faucibus a pellentesque sit amet porttitor. Dolor sed viverra ipsum nunc aliquet. Donec enim diam vulputate ut pharetra sit amet. Feugiat sed lectus vestibulum mattis ullamcorper velit sed. Erat pellentesque adipiscing commodo elit at imperdiet. Nisl purus in mollis nunc sed id semper risus.
+
+Tincidunt augue interdum velit euismod in pellentesque massa. Facilisis magna etiam tempor orci. Mauris in aliquam sem fringilla ut. Gravida dictum fusce ut placerat orci. Sed risus ultricies tristique nulla. Odio morbi quis commodo odio. Feugiat in ante metus dictum at tempor commodo ullamcorper. Porta non pulvinar neque laoreet suspendisse interdum. Etiam tempor orci eu lobortis elementum. Fusce ut placerat orci nulla pellentesque dignissim. Ornare lectus sit amet est placerat in egestas erat. Quis vel eros donec ac. Elementum pulvinar etiam non quam lacus. Sit amet tellus cras adipiscing enim eu turpis. Amet tellus cras adipiscing enim eu. Sed faucibus turpis in eu mi bibendum. Lectus proin nibh nisl condimentum id.
+
+Sollicitudin nibh sit amet commodo nulla. Sed tempus urna et pharetra pharetra massa massa. Magna eget est lorem ipsum. Elit ullamcorper dignissim cras tincidunt lobortis feugiat vivamus at. Fermentum dui faucibus in ornare quam viverra orci sagittis eu. Dignissim convallis aenean et tortor. Ut faucibus pulvinar elementum integer enim neque. Nibh cras pulvinar mattis nunc sed. Pellentesque sit amet porttitor eget dolor morbi. Mi eget mauris pharetra et ultrices neque ornare aenean euismod. Quis risus sed vulputate odio ut enim blandit volutpat. Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. In vitae turpis massa sed elementum tempus egestas sed sed. Urna id volutpat lacus laoreet non. Egestas pretium aenean pharetra magna ac placerat. Amet commodo nulla facilisi nullam vehicula ipsum a arcu cursus. Donec et odio pellentesque diam volutpat commodo sed. Etiam non quam lacus suspendisse.
+
+Augue neque gravida in fermentum et sollicitudin ac orci. Eu feugiat pretium nibh ipsum. Nam at lectus urna duis convallis convallis tellus id. Egestas integer eget aliquet nibh. Viverra accumsan in nisl nisi scelerisque eu ultrices vitae auctor. Urna condimentum mattis pellentesque id nibh tortor id. In egestas erat imperdiet sed euismod. Ut sem viverra aliquet eget sit amet tellus. Feugiat pretium nibh ipsum consequat nisl vel pretium. Volutpat odio facilisis mauris sit amet.
+
+Mi sit amet mauris commodo quis imperdiet massa tincidunt. Neque volutpat ac tincidunt vitae semper quis lectus nulla at. Nec feugiat in fermentum posuere urna nec. Ut venenatis tellus in metus vulputate eu. Vestibulum rhoncus est pellentesque elit ullamcorper dignissim. Eu scelerisque felis imperdiet proin. Vitae et leo duis ut diam quam nulla. Ut venenatis tellus in metus vulputate eu scelerisque. Tincidunt dui ut ornare lectus sit amet. Adipiscing diam donec adipiscing tristique risus. Turpis nunc eget lorem dolor sed viverra ipsum nunc aliquet. Non sodales neque sodales ut. Massa placerat duis ultricies lacus sed turpis tincidunt. Viverra orci sagittis eu volutpat odio facilisis mauris sit amet.
+
+Adipiscing vitae proin sagittis nisl. Vitae aliquet nec ullamcorper sit. Potenti nullam ac tortor vitae purus. Ultricies lacus sed turpis tincidunt id. Ut diam quam nulla porttitor massa id neque aliquam vestibulum. Semper eget duis at tellus at urna condimentum mattis pellentesque. Nec tincidunt praesent semper feugiat nibh sed pulvinar proin. Dictum fusce ut placerat orci nulla pellentesque dignissim. Amet luctus venenatis lectus magna fringilla urna. Quam quisque id diam vel quam elementum pulvinar. At tempor commodo ullamcorper a. Magna etiam tempor orci eu lobortis. Suspendisse ultrices gravida dictum fusce. Massa ultricies mi quis hendrerit dolor magna.
+
+Massa tincidunt nunc pulvinar sapien et ligula ullamcorper malesuada proin. Aliquet enim tortor at auctor urna nunc id. Semper feugiat nibh sed pulvinar proin gravida. Porttitor rhoncus dolor purus non enim. Metus aliquam eleifend mi in nulla. Lectus arcu bibendum at varius vel pharetra. Sed vulputate odio ut enim blandit volutpat. Et ligula ullamcorper malesuada proin libero nunc consequat interdum varius. Donec et odio pellentesque diam volutpat commodo. Id ornare arcu odio ut sem nulla pharetra diam sit.
+
+Est ullamcorper eget nulla facilisi etiam dignissim diam quis enim. Sagittis vitae et leo duis ut diam quam nulla. Elementum nisi quis eleifend quam. Congue mauris rhoncus aenean vel elit. Adipiscing elit duis tristique sollicitudin nibh sit. Egestas egestas fringilla phasellus faucibus scelerisque. Morbi tincidunt augue interdum velit euismod. Massa sed elementum tempus egestas sed sed. Id leo in vitae turpis massa sed elementum tempus egestas. In pellentesque massa placerat duis ultricies lacus sed turpis. Vitae proin sagittis nisl rhoncus mattis rhoncus. Enim tortor at auctor urna nunc id. In fermentum posuere urna nec tincidunt praesent semper feugiat nibh. Aliquam ut porttitor leo a diam sollicitudin tempor id. Pellentesque elit eget gravida cum sociis natoque. Molestie at elementum eu facilisis sed odio morbi quis. Tristique senectus et netus et malesuada fames ac turpis. Proin libero nunc consequat interdum varius sit amet mattis. Pellentesque id nibh tortor id.
+
+Risus sed vulputate odio ut enim blandit. Laoreet suspendisse interdum consectetur libero id faucibus nisl tincidunt eget. Morbi tincidunt augue interdum velit euismod in pellentesque. Pharetra pharetra massa massa ultricies mi quis hendrerit. Nunc aliquet bibendum enim facilisis gravida neque. Feugiat sed lectus vestibulum mattis ullamcorper velit sed ullamcorper. Risus quis varius quam quisque id diam vel. Et ultrices neque ornare aenean. Aliquet sagittis id consectetur purus ut faucibus pulvinar elementum. Nibh ipsum consequat nisl vel. Mauris rhoncus aenean vel elit scelerisque mauris pellentesque pulvinar. Ornare quam viverra orci sagittis eu volutpat odio facilisis. Euismod nisi porta lorem mollis aliquam. Enim ut tellus elementum sagittis. Rhoncus mattis rhoncus urna neque. Malesuada fames ac turpis egestas. Cursus in hac habitasse platea dictumst quisque sagittis. Sit amet aliquam id diam maecenas ultricies mi eget mauris.
+
+Enim sit amet venenatis urna cursus eget nunc. Fermentum odio eu feugiat pretium nibh ipsum consequat. Eu scelerisque felis imperdiet proin. Nullam non nisi est sit amet facilisis magna etiam tempor. In mollis nunc sed id semper risus in hendrerit. Sollicitudin nibh sit amet commodo nulla facilisi nullam. Sit amet nisl purus in mollis nunc sed id. Nam libero justo laoreet sit amet cursus sit amet dictum. Condimentum id venenatis a condimentum vitae sapien pellentesque. Porta nibh venenatis cras sed felis. Lectus nulla at volutpat diam ut venenatis tellus in. Aliquam etiam erat velit scelerisque in dictum non consectetur a. Leo vel fringilla est ullamcorper eget. Sodales ut etiam sit amet nisl purus in mollis nunc. Euismod nisi porta lorem mollis aliquam. Ornare arcu odio ut sem nulla. Sed felis eget velit aliquet sagittis id consectetur. Pellentesque nec nam aliquam sem et tortor consequat id. Enim nec dui nunc mattis enim ut tellus elementum.
+
+Nullam non nisi est sit amet facilisis magna. Rutrum quisque non tellus orci ac auctor augue. Nunc vel risus commodo viverra maecenas accumsan lacus. Viverra vitae congue eu consequat. Sollicitudin nibh sit amet commodo nulla. Amet volutpat consequat mauris nunc congue nisi. Maecenas pharetra convallis posuere morbi leo urna molestie at. Mattis vulputate enim nulla aliquet porttitor lacus luctus accumsan tortor. Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc consequat. Adipiscing diam donec adipiscing tristique risus. Elementum curabitur vitae nunc sed velit dignissim sodales ut. Eleifend donec pretium vulputate sapien nec. Commodo quis imperdiet massa tincidunt nunc pulvinar. Proin libero nunc consequat interdum varius sit amet mattis. Facilisis gravida neque convallis a cras semper auctor neque vitae. Quisque egestas diam in arcu cursus. Nunc eget lorem dolor sed viverra ipsum. Mauris sit amet massa vitae tortor condimentum lacinia quis vel.
+
+Aliquam sem et tortor consequat id porta nibh venenatis cras. Nunc sed id semper risus in. Enim sed faucibus turpis in eu mi bibendum neque. Molestie nunc non blandit massa enim. Enim praesent elementum facilisis leo vel fringilla est ullamcorper. Semper risus in hendrerit gravida rutrum quisque non tellus orci. Ac turpis egestas maecenas pharetra. In nulla posuere sollicitudin aliquam. Justo nec ultrices dui sapien eget mi proin sed libero. In ornare quam viverra orci sagittis eu. Proin nibh nisl condimentum id venenatis. Morbi enim nunc faucibus a pellentesque sit amet porttitor eget. Quis risus sed vulputate odio ut enim blandit. Risus feugiat in ante metus dictum at tempor commodo. Sodales neque sodales ut etiam. Nunc id cursus metus aliquam.
+
+Gravida dictum fusce ut placerat orci nulla pellentesque dignissim enim. Augue ut lectus arcu bibendum at. Quis varius quam quisque id diam vel quam. Egestas congue quisque egestas diam in arcu. Condimentum mattis pellentesque id nibh tortor id aliquet lectus. Enim lobortis scelerisque fermentum dui faucibus in. In tellus integer feugiat scelerisque varius morbi enim nunc. Mattis molestie a iaculis at erat pellentesque. Elit scelerisque mauris pellentesque pulvinar pellentesque habitant morbi tristique. Lorem ipsum dolor sit amet consectetur adipiscing elit ut aliquam. Nisl rhoncus mattis rhoncus urna neque. Ac auctor augue mauris augue neque gravida in fermentum et. Sodales ut eu sem integer vitae justo eget. Sed egestas egestas fringilla phasellus.
+
+Viverra adipiscing at in tellus integer feugiat scelerisque varius. Purus gravida quis blandit turpis. Id porta nibh venenatis cras sed. Mattis vulputate enim nulla aliquet porttitor lacus. Augue eget arcu dictum varius duis at consectetur lorem donec. Nulla at volutpat diam ut venenatis tellus in metus. Aliquam etiam erat velit scelerisque in dictum non consectetur. Turpis cursus in hac habitasse platea dictumst. Consequat mauris nunc congue nisi vitae suscipit tellus. Volutpat maecenas volutpat blandit aliquam etiam. Massa massa ultricies mi quis hendrerit dolor magna eget est. Velit egestas dui id ornare arcu. Non consectetur a erat nam at. Orci sagittis eu volutpat odio facilisis mauris sit amet. Dui id ornare arcu odio. Sed arcu non odio euismod lacinia.
+
+Feugiat in ante metus dictum. Gravida arcu ac tortor dignissim convallis. Egestas sed tempus urna et pharetra pharetra massa massa. Nulla facilisi nullam vehicula ipsum a arcu. Ipsum a arcu cursus vitae congue mauris. Porttitor rhoncus dolor purus non. Magna sit amet purus gravida quis blandit. Sapien eget mi proin sed libero enim sed faucibus turpis. Nisl nunc mi ipsum faucibus vitae aliquet nec ullamcorper sit. Pellentesque dignissim enim sit amet venenatis urna cursus eget. Pharetra massa massa ultricies mi quis hendrerit. Sapien nec sagittis aliquam malesuada bibendum. Nunc scelerisque viverra mauris in aliquam sem fringilla ut. Dolor magna eget est lorem ipsum dolor. Amet commodo nulla facilisi nullam. Pellentesque elit ullamcorper dignissim cras. Id porta nibh venenatis cras sed felis eget. Nam at lectus urna duis.
+
+Laoreet non curabitur gravida arcu ac tortor dignissim convallis. Nunc lobortis mattis aliquam faucibus purus in massa tempor. Sit amet luctus venenatis lectus magna fringilla. Duis ultricies lacus sed turpis tincidunt id. Sed velit dignissim sodales ut eu. Ut tortor pretium viverra suspendisse potenti nullam. Iaculis at erat pellentesque adipiscing. Ipsum nunc aliquet bibendum enim facilisis gravida neque. Nulla aliquet enim tortor at auctor urna nunc id cursus. Amet cursus sit amet dictum sit amet justo donec enim.
+
+Enim nunc faucibus a pellentesque sit amet porttitor eget dolor. Pharetra magna ac placerat vestibulum lectus mauris ultrices eros in. Nulla facilisi etiam dignissim diam quis enim. Ut enim blandit volutpat maecenas volutpat blandit aliquam etiam erat. Imperdiet proin fermentum leo vel orci porta non pulvinar neque. Vel fringilla est ullamcorper eget nulla. Bibendum neque egestas congue quisque egestas diam in arcu cursus. Ipsum nunc aliquet bibendum enim facilisis gravida neque convallis a. Arcu cursus vitae congue mauris rhoncus aenean vel elit. Augue eget arcu dictum varius duis. Tristique et egestas quis ipsum. Quis varius quam quisque id. Varius sit amet mattis vulputate. Mattis molestie a iaculis at erat pellentesque. Libero justo laoreet sit amet cursus. Aliquam id diam maecenas ultricies mi eget mauris pharetra. Ut eu sem integer vitae justo eget. Fames ac turpis egestas sed. Suspendisse in est ante in nibh mauris cursus mattis.
+
+Faucibus pulvinar elementum integer enim neque volutpat ac tincidunt vitae. Neque vitae tempus quam pellentesque nec nam aliquam. Lobortis elementum nibh tellus molestie nunc non. Lacus vel facilisis volutpat est velit egestas dui. Justo laoreet sit amet cursus sit amet dictum sit amet. Adipiscing enim eu turpis egestas pretium aenean pharetra magna. Cursus metus aliquam eleifend mi in nulla posuere. Nibh mauris cursus mattis molestie a. Dignissim diam quis enim lobortis scelerisque fermentum. A scelerisque purus semper eget duis at tellus. Lacus sed turpis tincidunt id aliquet risus feugiat in. Non tellus orci ac auctor. Ultrices in iaculis nunc sed augue lacus. Tincidunt tortor aliquam nulla facilisi cras.
+
+Nulla facilisi nullam vehicula ipsum a arcu cursus vitae congue. Eget magna fermentum iaculis eu non diam phasellus. Pharetra massa massa ultricies mi quis. Eget mauris pharetra et ultrices neque ornare. Aliquam faucibus purus in massa. Facilisi morbi tempus iaculis urna id volutpat lacus. Accumsan lacus vel facilisis volutpat. Curabitur gravida arcu ac tortor. Quam lacus suspendisse faucibus interdum. Elementum nibh tellus molestie nunc non blandit massa enim. Libero id faucibus nisl tincidunt. Bibendum ut tristique et egestas. Ut diam quam nulla porttitor massa id neque aliquam vestibulum. Augue interdum velit euismod in pellentesque. Adipiscing diam donec adipiscing tristique risus nec feugiat. Fringilla ut morbi tincidunt augue interdum velit. Vitae et leo duis ut diam quam nulla porttitor massa.
+
+Egestas integer eget aliquet nibh praesent tristique. Posuere sollicitudin aliquam ultrices sagittis orci a. Nisi est sit amet facilisis. Risus quis varius quam quisque id diam. Faucibus turpis in eu mi. Et molestie ac feugiat sed lectus vestibulum. Porttitor lacus luctus accumsan tortor posuere ac. Platea dictumst vestibulum rhoncus est pellentesque. Tortor pretium viverra suspendisse potenti nullam ac tortor. Enim praesent elementum facilisis leo vel fringilla est. Proin libero nunc consequat interdum varius sit amet mattis vulputate. Turpis egestas pretium aenean pharetra magna ac placerat vestibulum lectus. Nulla pharetra diam sit amet nisl suscipit. Mauris nunc congue nisi vitae suscipit tellus mauris a diam. Faucibus in ornare quam viverra orci sagittis eu volutpat. Volutpat consequat mauris nunc congue nisi vitae. Dui nunc mattis enim ut tellus. Adipiscing elit ut aliquam purus sit amet luctus.
+
+Tempus egestas sed sed risus. Scelerisque fermentum dui faucibus in ornare quam viverra orci. Massa ultricies mi quis hendrerit dolor magna eget. Pulvinar mattis nunc sed blandit libero volutpat sed cras ornare. Ut eu sem integer vitae justo eget magna fermentum. Ornare quam viverra orci sagittis. Eget dolor morbi non arcu risus quis varius quam. Tincidunt praesent semper feugiat nibh sed pulvinar. Sit amet justo donec enim diam vulputate. Dui faucibus in ornare quam viverra. Tincidunt tortor aliquam nulla facilisi cras fermentum odio eu. Turpis egestas sed tempus urna et. Pretium quam vulputate dignissim suspendisse in est ante in.
+
+Morbi quis commodo odio aenean sed adipiscing diam donec. Nunc mattis enim ut tellus elementum sagittis vitae et. Diam vel quam elementum pulvinar etiam non quam. Convallis posuere morbi leo urna molestie at elementum eu. Adipiscing at in tellus integer feugiat scelerisque varius morbi. Quis varius quam quisque id diam vel quam elementum. Dui accumsan sit amet nulla. Adipiscing elit duis tristique sollicitudin nibh sit amet commodo. Viverra ipsum nunc aliquet bibendum enim facilisis. Porta lorem mollis aliquam ut. Velit ut tortor pretium viverra suspendisse potenti. Quis viverra nibh cras pulvinar mattis nunc sed blandit. Pharetra magna ac placerat vestibulum. Mauris ultrices eros in cursus turpis massa.
+
+Lacus vestibulum sed arcu non odio euismod lacinia at. Dapibus ultrices in iaculis nunc sed. Cras adipiscing enim eu turpis egestas. Eget arcu dictum varius duis at consectetur. Consequat id porta nibh venenatis cras sed felis eget velit. Integer enim neque volutpat ac tincidunt vitae. Feugiat pretium nibh ipsum consequat nisl vel pretium lectus. Ut morbi tincidunt augue interdum velit euismod. Sed cras ornare arcu dui vivamus arcu felis bibendum ut. Eget felis eget nunc lobortis mattis aliquam faucibus purus in. Luctus venenatis lectus magna fringilla urna porttitor rhoncus dolor. Nisl nunc mi ipsum faucibus vitae. Proin fermentum leo vel orci porta. Nisi quis eleifend quam adipiscing vitae proin sagittis nisl. Et leo duis ut diam quam. Eros in cursus turpis massa tincidunt. Volutpat est velit egestas dui id. Commodo odio aenean sed adipiscing diam. Quis blandit turpis cursus in hac habitasse platea dictumst quisque. Magna fringilla urna porttitor rhoncus dolor.
+
+Amet consectetur adipiscing elit ut aliquam purus sit amet. Vitae justo eget magna fermentum iaculis eu non diam. Hendrerit dolor magna eget est. Ac placerat vestibulum lectus mauris ultrices eros in cursus turpis. Egestas diam in arcu cursus. At varius vel pharetra vel turpis nunc. Lacus vel facilisis volutpat est velit. Ut ornare lectus sit amet est placerat in egestas. Quam adipiscing vitae proin sagittis nisl rhoncus. Dolor purus non enim praesent. Urna condimentum mattis pellentesque id. Magnis dis parturient montes nascetur ridiculus. Feugiat nisl pretium fusce id. Sed cras ornare arcu dui vivamus. Vitae turpis massa sed elementum tempus egestas sed sed. Ac feugiat sed lectus vestibulum mattis ullamcorper velit sed ullamcorper. Ac ut consequat semper viverra nam libero. Consectetur lorem donec massa sapien faucibus. Purus viverra accumsan in nisl nisi scelerisque eu ultrices.
+
+Eu turpis egestas pretium aenean pharetra. Nisl rhoncus mattis rhoncus urna neque viverra justo nec ultrices. Pellentesque sit amet porttitor eget dolor morbi non arcu. Vitae justo eget magna fermentum iaculis. Quis auctor elit sed vulputate mi sit. Purus viverra accumsan in nisl nisi scelerisque eu ultrices. Semper auctor neque vitae tempus quam pellentesque nec nam. Rhoncus dolor purus non enim. Sed turpis tincidunt id aliquet risus feugiat. Sit amet justo donec enim diam vulputate ut pharetra sit. Risus pretium quam vulputate dignissim suspendisse in est ante in. Massa sapien faucibus et molestie ac feugiat. Id aliquet risus feugiat in ante metus. Risus ultricies tristique nulla aliquet enim tortor at auctor urna. Sed lectus vestibulum mattis ullamcorper velit sed ullamcorper morbi.
+
+Lacus sed turpis tincidunt id aliquet risus feugiat in. Risus ultricies tristique nulla aliquet enim tortor. In ornare quam viverra orci sagittis eu volutpat. Netus et malesuada fames ac turpis egestas sed tempus urna. Fames ac turpis egestas maecenas pharetra convallis posuere morbi. Etiam erat velit scelerisque in dictum non. Cursus turpis massa tincidunt dui ut ornare lectus. Tristique sollicitudin nibh sit amet commodo nulla facilisi. Pellentesque pulvinar pellentesque habitant morbi tristique senectus et. Aliquet eget sit amet tellus cras. Nullam ac tortor vitae purus faucibus ornare. Lacus viverra vitae congue eu consequat. Vulputate ut pharetra sit amet. Est ante in nibh mauris cursus mattis molestie a. Ipsum suspendisse ultrices gravida dictum fusce ut placerat orci.
+
+Et tortor at risus viverra. Sed libero enim sed faucibus turpis in eu. Id cursus metus aliquam eleifend mi in nulla posuere sollicitudin. Risus viverra adipiscing at in. Imperdiet massa tincidunt nunc pulvinar sapien et. Nec feugiat in fermentum posuere urna nec tincidunt. Ultricies mi eget mauris pharetra et. Morbi tristique senectus et netus et malesuada fames ac. At quis risus sed vulputate. Interdum velit laoreet id donec. Sapien pellentesque habitant morbi tristique. Pharetra vel turpis nunc eget lorem dolor sed viverra. In massa tempor nec feugiat nisl. Massa tincidunt nunc pulvinar sapien et ligula ullamcorper malesuada proin. Mauris augue neque gravida in.
+
+Faucibus vitae aliquet nec ullamcorper sit amet risus. Id velit ut tortor pretium viverra suspendisse potenti. Leo integer malesuada nunc vel risus commodo viverra maecenas. Risus quis varius quam quisque id. Aliquam malesuada bibendum arcu vitae elementum curabitur vitae. Vestibulum lectus mauris ultrices eros in cursus turpis. Fermentum posuere urna nec tincidunt. Magna etiam tempor orci eu lobortis elementum nibh tellus molestie. Id ornare arcu odio ut. Facilisi nullam vehicula ipsum a arcu cursus vitae congue. Nulla pellentesque dignissim enim sit amet venenatis urna cursus eget. Viverra mauris in aliquam sem fringilla ut morbi tincidunt. Quis ipsum suspendisse ultrices gravida dictum fusce ut placerat orci. Sed cras ornare arcu dui vivamus arcu felis. Egestas diam in arcu cursus euismod quis.
+
+Tincidunt dui ut ornare lectus. Morbi tristique senectus et netus et. Ornare arcu dui vivamus arcu felis bibendum ut tristique. Habitant morbi tristique senectus et netus et malesuada fames ac. Ut tristique et egestas quis. Mollis aliquam ut porttitor leo. Venenatis tellus in metus vulputate eu scelerisque felis imperdiet proin. Sagittis eu volutpat odio facilisis mauris sit amet massa. Eu facilisis sed odio morbi. Nunc consequat interdum varius sit amet mattis. Velit dignissim sodales ut eu. Pellentesque eu tincidunt tortor aliquam. Porta lorem mollis aliquam ut porttitor. Rhoncus urna neque viverra justo nec ultrices. Viverra suspendisse potenti nullam ac tortor vitae purus. Fermentum posuere urna nec tincidunt praesent semper feugiat nibh sed. Purus sit amet luctus venenatis lectus magna fringilla urna porttitor. Sed lectus vestibulum mattis ullamcorper velit sed ullamcorper. Nulla posuere sollicitudin aliquam ultrices sagittis orci a scelerisque. Nisl nisi scelerisque eu ultrices vitae auctor.
+
+In vitae turpis massa sed elementum tempus egestas. Cursus sit amet dictum sit amet justo donec enim. Vitae congue eu consequat ac felis donec et. Augue interdum velit euismod in pellentesque massa placerat. Enim ut sem viverra aliquet eget sit amet. Velit scelerisque in dictum non consectetur a erat. Sed lectus vestibulum mattis ullamcorper velit sed ullamcorper. Nunc faucibus a pellentesque sit amet porttitor eget. Tellus integer feugiat scelerisque varius morbi. Lorem sed risus ultricies tristique nulla aliquet enim tortor at. Eget nulla facilisi etiam dignissim diam quis enim lobortis scelerisque. Adipiscing elit duis tristique sollicitudin. Adipiscing elit pellentesque habitant morbi tristique. Ac tincidunt vitae semper quis lectus nulla at.
+
+Maecenas sed enim ut sem viverra. Erat pellentesque adipiscing commodo elit at imperdiet. Dolor morbi non arcu risus quis varius quam quisque. Fringilla urna porttitor rhoncus dolor purus non enim praesent. Tellus integer feugiat scelerisque varius morbi enim nunc faucibus a. Felis eget nunc lobortis mattis aliquam faucibus purus in. Fringilla phasellus faucibus scelerisque eleifend. Pulvinar etiam non quam lacus suspendisse faucibus interdum posuere. Risus ultricies tristique nulla aliquet. Lectus sit amet est placerat. Ac ut consequat semper viverra nam libero justo. Dapibus ultrices in iaculis nunc sed augue. Mattis ullamcorper velit sed ullamcorper. Eget nullam non nisi est. Vitae elementum curabitur vitae nunc sed velit.
+
+Sit amet commodo nulla facilisi nullam vehicula ipsum a arcu. Tempor nec feugiat nisl pretium fusce id velit ut. Nulla pellentesque dignissim enim sit amet venenatis. Sed tempus urna et pharetra pharetra. Congue quisque egestas diam in. Convallis posuere morbi leo urna. Nec tincidunt praesent semper feugiat nibh sed pulvinar proin gravida. Sagittis nisl rhoncus mattis rhoncus urna neque viverra justo. Scelerisque felis imperdiet proin fermentum leo vel. Ut placerat orci nulla pellentesque dignissim enim sit amet. In cursus turpis massa tincidunt dui. Rutrum quisque non tellus orci ac auctor augue mauris augue. Cursus vitae congue mauris rhoncus aenean vel elit scelerisque mauris.
+
+Scelerisque fermentum dui faucibus in ornare quam viverra orci. Habitant morbi tristique senectus et netus et. Ridiculus mus mauris vitae ultricies leo. Vitae semper quis lectus nulla at volutpat diam. Purus faucibus ornare suspendisse sed nisi. Enim lobortis scelerisque fermentum dui faucibus in ornare quam. Mi tempus imperdiet nulla malesuada pellentesque elit eget. Varius duis at consectetur lorem donec. Pulvinar pellentesque habitant morbi tristique senectus et netus et. A iaculis at erat pellentesque adipiscing commodo elit at imperdiet.
+
+Mi ipsum faucibus vitae aliquet nec. Libero volutpat sed cras ornare arcu dui vivamus arcu. Natoque penatibus et magnis dis parturient montes nascetur ridiculus. Maecenas volutpat blandit aliquam etiam erat velit scelerisque. Cras adipiscing enim eu turpis. Nec tincidunt praesent semper feugiat nibh sed pulvinar. Justo laoreet sit amet cursus sit amet dictum sit. Velit scelerisque in dictum non consectetur a erat nam. Turpis tincidunt id aliquet risus feugiat in ante. Aliquet risus feugiat in ante metus dictum. Hac habitasse platea dictumst quisque sagittis purus sit. Et pharetra pharetra massa massa ultricies. Sit amet nisl suscipit adipiscing bibendum est ultricies integer. Venenatis urna cursus eget nunc scelerisque viverra mauris in. Integer quis auctor elit sed. In est ante in nibh mauris cursus mattis molestie. Scelerisque in dictum non consectetur a erat nam at.
+
+Lectus sit amet est placerat in. Sit amet cursus sit amet. Nibh nisl condimentum id venenatis a condimentum. Purus ut faucibus pulvinar elementum integer enim. Pharetra sit amet aliquam id diam maecenas. Id cursus metus aliquam eleifend mi in nulla posuere. Lobortis mattis aliquam faucibus purus in massa tempor nec. Urna neque viverra justo nec ultrices dui sapien eget. Enim ut sem viverra aliquet eget sit amet. In eu mi bibendum neque egestas congue quisque egestas. Enim neque volutpat ac tincidunt. Orci ac auctor augue mauris augue neque gravida in fermentum. Velit aliquet sagittis id consectetur. Enim ut sem viverra aliquet eget sit amet tellus.
+
+Semper auctor neque vitae tempus quam pellentesque nec. Non blandit massa enim nec dui nunc. Morbi blandit cursus risus at ultrices mi tempus imperdiet nulla. Arcu non odio euismod lacinia at quis risus. Dictum varius duis at consectetur lorem donec massa. Blandit massa enim nec dui. Nibh ipsum consequat nisl vel. Turpis in eu mi bibendum neque. Ut tristique et egestas quis. Ac odio tempor orci dapibus. Gravida dictum fusce ut placerat orci nulla pellentesque dignissim. Integer feugiat scelerisque varius morbi enim. Libero volutpat sed cras ornare arcu dui. Odio aenean sed adipiscing diam. Et egestas quis ipsum suspendisse ultrices. Aliquet lectus proin nibh nisl condimentum. Sit amet consectetur adipiscing elit duis tristique sollicitudin nibh sit. Blandit massa enim nec dui. Tellus molestie nunc non blandit massa enim nec. Tortor vitae purus faucibus ornare suspendisse sed nisi.
+
+Nascetur ridiculus mus mauris vitae ultricies leo. Elementum facilisis leo vel fringilla est ullamcorper eget nulla. Diam maecenas ultricies mi eget. Duis tristique sollicitudin nibh sit amet commodo nulla. Tempus iaculis urna id volutpat lacus laoreet non curabitur gravida. Dictumst quisque sagittis purus sit amet. Viverra mauris in aliquam sem. Quis risus sed vulputate odio ut enim blandit volutpat maecenas. Condimentum mattis pellentesque id nibh tortor id. Non sodales neque sodales ut etiam sit amet. Ipsum consequat nisl vel pretium. Cursus in hac habitasse platea dictumst quisque sagittis purus sit. Fringilla est ullamcorper eget nulla facilisi etiam. Tellus elementum sagittis vitae et leo duis ut diam quam. Nisl vel pretium lectus quam id leo in.'''
diff --git a/tests/data/valid/toml-lang-compliance/valid/qa/qa-table-inline-1000.json b/tests/data/valid/toml-lang-compliance/valid/qa/qa-table-inline-1000.json
new file mode 100644
index 0000000..4a8655f
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/qa/qa-table-inline-1000.json
@@ -0,0 +1,2 @@
+{"key":{
+ "key1":{"type":"string","value":"abcdefg"}, "key2":{"type":"string","value":"abcdefg"}, "key3":{"type":"string","value":"abcdefg"}, "key4":{"type":"string","value":"abcdefg"}, "key5":{"type":"string","value":"abcdefg"}, "key6":{"type":"string","value":"abcdefg"}, "key7":{"type":"string","value":"abcdefg"}, "key8":{"type":"string","value":"abcdefg"}, "key9":{"type":"string","value":"abcdefg"}, "key10":{"type":"string","value":"abcdefg"}, "key11":{"type":"string","value":"abcdefg"}, "key12":{"type":"string","value":"abcdefg"}, "key13":{"type":"string","value":"abcdefg"}, "key14":{"type":"string","value":"abcdefg"}, "key15":{"type":"string","value":"abcdefg"}, "key16":{"type":"string","value":"abcdefg"}, "key17":{"type":"string","value":"abcdefg"}, "key18":{"type":"string","value":"abcdefg"}, "key19":{"type":"string","value":"abcdefg"}, "key20":{"type":"string","value":"abcdefg"}, "key21":{"type":"string","value":"abcdefg"}, "key22":{"type":"string","value":"abcdefg"}, "key23":{"type":"string","value":"abcdefg"}, "key24":{"type":"string","value":"abcdefg"}, "key25":{"type":"string","value":"abcdefg"}, "key26":{"type":"string","value":"abcdefg"}, "key27":{"type":"string","value":"abcdefg"}, "key28":{"type":"string","value":"abcdefg"}, "key29":{"type":"string","value":"abcdefg"}, "key30":{"type":"string","value":"abcdefg"}, "key31":{"type":"string","value":"abcdefg"}, "key32":{"type":"string","value":"abcdefg"}, "key33":{"type":"string","value":"abcdefg"}, "key34":{"type":"string","value":"abcdefg"}, "key35":{"type":"string","value":"abcdefg"}, "key36":{"type":"string","value":"abcdefg"}, "key37":{"type":"string","value":"abcdefg"}, "key38":{"type":"string","value":"abcdefg"}, "key39":{"type":"string","value":"abcdefg"}, "key40":{"type":"string","value":"abcdefg"}, "key41":{"type":"string","value":"abcdefg"}, "key42":{"type":"string","value":"abcdefg"}, "key43":{"type":"string","value":"abcdefg"}, "key44":{"type":"string","value":"abcdefg"}, "key45":{"type":"string","value":"abcdefg"}, "key46":{"type":"string","value":"abcdefg"}, "key47":{"type":"string","value":"abcdefg"}, "key48":{"type":"string","value":"abcdefg"}, "key49":{"type":"string","value":"abcdefg"}, "key50":{"type":"string","value":"abcdefg"}, "key51":{"type":"string","value":"abcdefg"}, "key52":{"type":"string","value":"abcdefg"}, "key53":{"type":"string","value":"abcdefg"}, "key54":{"type":"string","value":"abcdefg"}, "key55":{"type":"string","value":"abcdefg"}, "key56":{"type":"string","value":"abcdefg"}, "key57":{"type":"string","value":"abcdefg"}, "key58":{"type":"string","value":"abcdefg"}, "key59":{"type":"string","value":"abcdefg"}, "key60":{"type":"string","value":"abcdefg"}, "key61":{"type":"string","value":"abcdefg"}, "key62":{"type":"string","value":"abcdefg"}, "key63":{"type":"string","value":"abcdefg"}, "key64":{"type":"string","value":"abcdefg"}, "key65":{"type":"string","value":"abcdefg"}, "key66":{"type":"string","value":"abcdefg"}, "key67":{"type":"string","value":"abcdefg"}, "key68":{"type":"string","value":"abcdefg"}, "key69":{"type":"string","value":"abcdefg"}, "key70":{"type":"string","value":"abcdefg"}, "key71":{"type":"string","value":"abcdefg"}, "key72":{"type":"string","value":"abcdefg"}, "key73":{"type":"string","value":"abcdefg"}, "key74":{"type":"string","value":"abcdefg"}, "key75":{"type":"string","value":"abcdefg"}, "key76":{"type":"string","value":"abcdefg"}, "key77":{"type":"string","value":"abcdefg"}, "key78":{"type":"string","value":"abcdefg"}, "key79":{"type":"string","value":"abcdefg"}, "key80":{"type":"string","value":"abcdefg"}, "key81":{"type":"string","value":"abcdefg"}, "key82":{"type":"string","value":"abcdefg"}, "key83":{"type":"string","value":"abcdefg"}, "key84":{"type":"string","value":"abcdefg"}, "key85":{"type":"string","value":"abcdefg"}, "key86":{"type":"string","value":"abcdefg"}, "key87":{"type":"string","value":"abcdefg"}, "key88":{"type":"string","value":"abcdefg"}, "key89":{"type":"string","value":"abcdefg"}, "key90":{"type":"string","value":"abcdefg"}, "key91":{"type":"string","value":"abcdefg"}, "key92":{"type":"string","value":"abcdefg"}, "key93":{"type":"string","value":"abcdefg"}, "key94":{"type":"string","value":"abcdefg"}, "key95":{"type":"string","value":"abcdefg"}, "key96":{"type":"string","value":"abcdefg"}, "key97":{"type":"string","value":"abcdefg"}, "key98":{"type":"string","value":"abcdefg"}, "key99":{"type":"string","value":"abcdefg"}, "key100":{"type":"string","value":"abcdefg"}, "key101":{"type":"string","value":"abcdefg"}, "key102":{"type":"string","value":"abcdefg"}, "key103":{"type":"string","value":"abcdefg"}, "key104":{"type":"string","value":"abcdefg"}, "key105":{"type":"string","value":"abcdefg"}, "key106":{"type":"string","value":"abcdefg"}, "key107":{"type":"string","value":"abcdefg"}, "key108":{"type":"string","value":"abcdefg"}, "key109":{"type":"string","value":"abcdefg"}, "key110":{"type":"string","value":"abcdefg"}, "key111":{"type":"string","value":"abcdefg"}, "key112":{"type":"string","value":"abcdefg"}, "key113":{"type":"string","value":"abcdefg"}, "key114":{"type":"string","value":"abcdefg"}, "key115":{"type":"string","value":"abcdefg"}, "key116":{"type":"string","value":"abcdefg"}, "key117":{"type":"string","value":"abcdefg"}, "key118":{"type":"string","value":"abcdefg"}, "key119":{"type":"string","value":"abcdefg"}, "key120":{"type":"string","value":"abcdefg"}, "key121":{"type":"string","value":"abcdefg"}, "key122":{"type":"string","value":"abcdefg"}, "key123":{"type":"string","value":"abcdefg"}, "key124":{"type":"string","value":"abcdefg"}, "key125":{"type":"string","value":"abcdefg"}, "key126":{"type":"string","value":"abcdefg"}, "key127":{"type":"string","value":"abcdefg"}, "key128":{"type":"string","value":"abcdefg"}, "key129":{"type":"string","value":"abcdefg"}, "key130":{"type":"string","value":"abcdefg"}, "key131":{"type":"string","value":"abcdefg"}, "key132":{"type":"string","value":"abcdefg"}, "key133":{"type":"string","value":"abcdefg"}, "key134":{"type":"string","value":"abcdefg"}, "key135":{"type":"string","value":"abcdefg"}, "key136":{"type":"string","value":"abcdefg"}, "key137":{"type":"string","value":"abcdefg"}, "key138":{"type":"string","value":"abcdefg"}, "key139":{"type":"string","value":"abcdefg"}, "key140":{"type":"string","value":"abcdefg"}, "key141":{"type":"string","value":"abcdefg"}, "key142":{"type":"string","value":"abcdefg"}, "key143":{"type":"string","value":"abcdefg"}, "key144":{"type":"string","value":"abcdefg"}, "key145":{"type":"string","value":"abcdefg"}, "key146":{"type":"string","value":"abcdefg"}, "key147":{"type":"string","value":"abcdefg"}, "key148":{"type":"string","value":"abcdefg"}, "key149":{"type":"string","value":"abcdefg"}, "key150":{"type":"string","value":"abcdefg"}, "key151":{"type":"string","value":"abcdefg"}, "key152":{"type":"string","value":"abcdefg"}, "key153":{"type":"string","value":"abcdefg"}, "key154":{"type":"string","value":"abcdefg"}, "key155":{"type":"string","value":"abcdefg"}, "key156":{"type":"string","value":"abcdefg"}, "key157":{"type":"string","value":"abcdefg"}, "key158":{"type":"string","value":"abcdefg"}, "key159":{"type":"string","value":"abcdefg"}, "key160":{"type":"string","value":"abcdefg"}, "key161":{"type":"string","value":"abcdefg"}, "key162":{"type":"string","value":"abcdefg"}, "key163":{"type":"string","value":"abcdefg"}, "key164":{"type":"string","value":"abcdefg"}, "key165":{"type":"string","value":"abcdefg"}, "key166":{"type":"string","value":"abcdefg"}, "key167":{"type":"string","value":"abcdefg"}, "key168":{"type":"string","value":"abcdefg"}, "key169":{"type":"string","value":"abcdefg"}, "key170":{"type":"string","value":"abcdefg"}, "key171":{"type":"string","value":"abcdefg"}, "key172":{"type":"string","value":"abcdefg"}, "key173":{"type":"string","value":"abcdefg"}, "key174":{"type":"string","value":"abcdefg"}, "key175":{"type":"string","value":"abcdefg"}, "key176":{"type":"string","value":"abcdefg"}, "key177":{"type":"string","value":"abcdefg"}, "key178":{"type":"string","value":"abcdefg"}, "key179":{"type":"string","value":"abcdefg"}, "key180":{"type":"string","value":"abcdefg"}, "key181":{"type":"string","value":"abcdefg"}, "key182":{"type":"string","value":"abcdefg"}, "key183":{"type":"string","value":"abcdefg"}, "key184":{"type":"string","value":"abcdefg"}, "key185":{"type":"string","value":"abcdefg"}, "key186":{"type":"string","value":"abcdefg"}, "key187":{"type":"string","value":"abcdefg"}, "key188":{"type":"string","value":"abcdefg"}, "key189":{"type":"string","value":"abcdefg"}, "key190":{"type":"string","value":"abcdefg"}, "key191":{"type":"string","value":"abcdefg"}, "key192":{"type":"string","value":"abcdefg"}, "key193":{"type":"string","value":"abcdefg"}, "key194":{"type":"string","value":"abcdefg"}, "key195":{"type":"string","value":"abcdefg"}, "key196":{"type":"string","value":"abcdefg"}, "key197":{"type":"string","value":"abcdefg"}, "key198":{"type":"string","value":"abcdefg"}, "key199":{"type":"string","value":"abcdefg"}, "key200":{"type":"string","value":"abcdefg"}, "key201":{"type":"string","value":"abcdefg"}, "key202":{"type":"string","value":"abcdefg"}, "key203":{"type":"string","value":"abcdefg"}, "key204":{"type":"string","value":"abcdefg"}, "key205":{"type":"string","value":"abcdefg"}, "key206":{"type":"string","value":"abcdefg"}, "key207":{"type":"string","value":"abcdefg"}, "key208":{"type":"string","value":"abcdefg"}, "key209":{"type":"string","value":"abcdefg"}, "key210":{"type":"string","value":"abcdefg"}, "key211":{"type":"string","value":"abcdefg"}, "key212":{"type":"string","value":"abcdefg"}, "key213":{"type":"string","value":"abcdefg"}, "key214":{"type":"string","value":"abcdefg"}, "key215":{"type":"string","value":"abcdefg"}, "key216":{"type":"string","value":"abcdefg"}, "key217":{"type":"string","value":"abcdefg"}, "key218":{"type":"string","value":"abcdefg"}, "key219":{"type":"string","value":"abcdefg"}, "key220":{"type":"string","value":"abcdefg"}, "key221":{"type":"string","value":"abcdefg"}, "key222":{"type":"string","value":"abcdefg"}, "key223":{"type":"string","value":"abcdefg"}, "key224":{"type":"string","value":"abcdefg"}, "key225":{"type":"string","value":"abcdefg"}, "key226":{"type":"string","value":"abcdefg"}, "key227":{"type":"string","value":"abcdefg"}, "key228":{"type":"string","value":"abcdefg"}, "key229":{"type":"string","value":"abcdefg"}, "key230":{"type":"string","value":"abcdefg"}, "key231":{"type":"string","value":"abcdefg"}, "key232":{"type":"string","value":"abcdefg"}, "key233":{"type":"string","value":"abcdefg"}, "key234":{"type":"string","value":"abcdefg"}, "key235":{"type":"string","value":"abcdefg"}, "key236":{"type":"string","value":"abcdefg"}, "key237":{"type":"string","value":"abcdefg"}, "key238":{"type":"string","value":"abcdefg"}, "key239":{"type":"string","value":"abcdefg"}, "key240":{"type":"string","value":"abcdefg"}, "key241":{"type":"string","value":"abcdefg"}, "key242":{"type":"string","value":"abcdefg"}, "key243":{"type":"string","value":"abcdefg"}, "key244":{"type":"string","value":"abcdefg"}, "key245":{"type":"string","value":"abcdefg"}, "key246":{"type":"string","value":"abcdefg"}, "key247":{"type":"string","value":"abcdefg"}, "key248":{"type":"string","value":"abcdefg"}, "key249":{"type":"string","value":"abcdefg"}, "key250":{"type":"string","value":"abcdefg"}, "key251":{"type":"string","value":"abcdefg"}, "key252":{"type":"string","value":"abcdefg"}, "key253":{"type":"string","value":"abcdefg"}, "key254":{"type":"string","value":"abcdefg"}, "key255":{"type":"string","value":"abcdefg"}, "key256":{"type":"string","value":"abcdefg"}, "key257":{"type":"string","value":"abcdefg"}, "key258":{"type":"string","value":"abcdefg"}, "key259":{"type":"string","value":"abcdefg"}, "key260":{"type":"string","value":"abcdefg"}, "key261":{"type":"string","value":"abcdefg"}, "key262":{"type":"string","value":"abcdefg"}, "key263":{"type":"string","value":"abcdefg"}, "key264":{"type":"string","value":"abcdefg"}, "key265":{"type":"string","value":"abcdefg"}, "key266":{"type":"string","value":"abcdefg"}, "key267":{"type":"string","value":"abcdefg"}, "key268":{"type":"string","value":"abcdefg"}, "key269":{"type":"string","value":"abcdefg"}, "key270":{"type":"string","value":"abcdefg"}, "key271":{"type":"string","value":"abcdefg"}, "key272":{"type":"string","value":"abcdefg"}, "key273":{"type":"string","value":"abcdefg"}, "key274":{"type":"string","value":"abcdefg"}, "key275":{"type":"string","value":"abcdefg"}, "key276":{"type":"string","value":"abcdefg"}, "key277":{"type":"string","value":"abcdefg"}, "key278":{"type":"string","value":"abcdefg"}, "key279":{"type":"string","value":"abcdefg"}, "key280":{"type":"string","value":"abcdefg"}, "key281":{"type":"string","value":"abcdefg"}, "key282":{"type":"string","value":"abcdefg"}, "key283":{"type":"string","value":"abcdefg"}, "key284":{"type":"string","value":"abcdefg"}, "key285":{"type":"string","value":"abcdefg"}, "key286":{"type":"string","value":"abcdefg"}, "key287":{"type":"string","value":"abcdefg"}, "key288":{"type":"string","value":"abcdefg"}, "key289":{"type":"string","value":"abcdefg"}, "key290":{"type":"string","value":"abcdefg"}, "key291":{"type":"string","value":"abcdefg"}, "key292":{"type":"string","value":"abcdefg"}, "key293":{"type":"string","value":"abcdefg"}, "key294":{"type":"string","value":"abcdefg"}, "key295":{"type":"string","value":"abcdefg"}, "key296":{"type":"string","value":"abcdefg"}, "key297":{"type":"string","value":"abcdefg"}, "key298":{"type":"string","value":"abcdefg"}, "key299":{"type":"string","value":"abcdefg"}, "key300":{"type":"string","value":"abcdefg"}, "key301":{"type":"string","value":"abcdefg"}, "key302":{"type":"string","value":"abcdefg"}, "key303":{"type":"string","value":"abcdefg"}, "key304":{"type":"string","value":"abcdefg"}, "key305":{"type":"string","value":"abcdefg"}, "key306":{"type":"string","value":"abcdefg"}, "key307":{"type":"string","value":"abcdefg"}, "key308":{"type":"string","value":"abcdefg"}, "key309":{"type":"string","value":"abcdefg"}, "key310":{"type":"string","value":"abcdefg"}, "key311":{"type":"string","value":"abcdefg"}, "key312":{"type":"string","value":"abcdefg"}, "key313":{"type":"string","value":"abcdefg"}, "key314":{"type":"string","value":"abcdefg"}, "key315":{"type":"string","value":"abcdefg"}, "key316":{"type":"string","value":"abcdefg"}, "key317":{"type":"string","value":"abcdefg"}, "key318":{"type":"string","value":"abcdefg"}, "key319":{"type":"string","value":"abcdefg"}, "key320":{"type":"string","value":"abcdefg"}, "key321":{"type":"string","value":"abcdefg"}, "key322":{"type":"string","value":"abcdefg"}, "key323":{"type":"string","value":"abcdefg"}, "key324":{"type":"string","value":"abcdefg"}, "key325":{"type":"string","value":"abcdefg"}, "key326":{"type":"string","value":"abcdefg"}, "key327":{"type":"string","value":"abcdefg"}, "key328":{"type":"string","value":"abcdefg"}, "key329":{"type":"string","value":"abcdefg"}, "key330":{"type":"string","value":"abcdefg"}, "key331":{"type":"string","value":"abcdefg"}, "key332":{"type":"string","value":"abcdefg"}, "key333":{"type":"string","value":"abcdefg"}, "key334":{"type":"string","value":"abcdefg"}, "key335":{"type":"string","value":"abcdefg"}, "key336":{"type":"string","value":"abcdefg"}, "key337":{"type":"string","value":"abcdefg"}, "key338":{"type":"string","value":"abcdefg"}, "key339":{"type":"string","value":"abcdefg"}, "key340":{"type":"string","value":"abcdefg"}, "key341":{"type":"string","value":"abcdefg"}, "key342":{"type":"string","value":"abcdefg"}, "key343":{"type":"string","value":"abcdefg"}, "key344":{"type":"string","value":"abcdefg"}, "key345":{"type":"string","value":"abcdefg"}, "key346":{"type":"string","value":"abcdefg"}, "key347":{"type":"string","value":"abcdefg"}, "key348":{"type":"string","value":"abcdefg"}, "key349":{"type":"string","value":"abcdefg"}, "key350":{"type":"string","value":"abcdefg"}, "key351":{"type":"string","value":"abcdefg"}, "key352":{"type":"string","value":"abcdefg"}, "key353":{"type":"string","value":"abcdefg"}, "key354":{"type":"string","value":"abcdefg"}, "key355":{"type":"string","value":"abcdefg"}, "key356":{"type":"string","value":"abcdefg"}, "key357":{"type":"string","value":"abcdefg"}, "key358":{"type":"string","value":"abcdefg"}, "key359":{"type":"string","value":"abcdefg"}, "key360":{"type":"string","value":"abcdefg"}, "key361":{"type":"string","value":"abcdefg"}, "key362":{"type":"string","value":"abcdefg"}, "key363":{"type":"string","value":"abcdefg"}, "key364":{"type":"string","value":"abcdefg"}, "key365":{"type":"string","value":"abcdefg"}, "key366":{"type":"string","value":"abcdefg"}, "key367":{"type":"string","value":"abcdefg"}, "key368":{"type":"string","value":"abcdefg"}, "key369":{"type":"string","value":"abcdefg"}, "key370":{"type":"string","value":"abcdefg"}, "key371":{"type":"string","value":"abcdefg"}, "key372":{"type":"string","value":"abcdefg"}, "key373":{"type":"string","value":"abcdefg"}, "key374":{"type":"string","value":"abcdefg"}, "key375":{"type":"string","value":"abcdefg"}, "key376":{"type":"string","value":"abcdefg"}, "key377":{"type":"string","value":"abcdefg"}, "key378":{"type":"string","value":"abcdefg"}, "key379":{"type":"string","value":"abcdefg"}, "key380":{"type":"string","value":"abcdefg"}, "key381":{"type":"string","value":"abcdefg"}, "key382":{"type":"string","value":"abcdefg"}, "key383":{"type":"string","value":"abcdefg"}, "key384":{"type":"string","value":"abcdefg"}, "key385":{"type":"string","value":"abcdefg"}, "key386":{"type":"string","value":"abcdefg"}, "key387":{"type":"string","value":"abcdefg"}, "key388":{"type":"string","value":"abcdefg"}, "key389":{"type":"string","value":"abcdefg"}, "key390":{"type":"string","value":"abcdefg"}, "key391":{"type":"string","value":"abcdefg"}, "key392":{"type":"string","value":"abcdefg"}, "key393":{"type":"string","value":"abcdefg"}, "key394":{"type":"string","value":"abcdefg"}, "key395":{"type":"string","value":"abcdefg"}, "key396":{"type":"string","value":"abcdefg"}, "key397":{"type":"string","value":"abcdefg"}, "key398":{"type":"string","value":"abcdefg"}, "key399":{"type":"string","value":"abcdefg"}, "key400":{"type":"string","value":"abcdefg"}, "key401":{"type":"string","value":"abcdefg"}, "key402":{"type":"string","value":"abcdefg"}, "key403":{"type":"string","value":"abcdefg"}, "key404":{"type":"string","value":"abcdefg"}, "key405":{"type":"string","value":"abcdefg"}, "key406":{"type":"string","value":"abcdefg"}, "key407":{"type":"string","value":"abcdefg"}, "key408":{"type":"string","value":"abcdefg"}, "key409":{"type":"string","value":"abcdefg"}, "key410":{"type":"string","value":"abcdefg"}, "key411":{"type":"string","value":"abcdefg"}, "key412":{"type":"string","value":"abcdefg"}, "key413":{"type":"string","value":"abcdefg"}, "key414":{"type":"string","value":"abcdefg"}, "key415":{"type":"string","value":"abcdefg"}, "key416":{"type":"string","value":"abcdefg"}, "key417":{"type":"string","value":"abcdefg"}, "key418":{"type":"string","value":"abcdefg"}, "key419":{"type":"string","value":"abcdefg"}, "key420":{"type":"string","value":"abcdefg"}, "key421":{"type":"string","value":"abcdefg"}, "key422":{"type":"string","value":"abcdefg"}, "key423":{"type":"string","value":"abcdefg"}, "key424":{"type":"string","value":"abcdefg"}, "key425":{"type":"string","value":"abcdefg"}, "key426":{"type":"string","value":"abcdefg"}, "key427":{"type":"string","value":"abcdefg"}, "key428":{"type":"string","value":"abcdefg"}, "key429":{"type":"string","value":"abcdefg"}, "key430":{"type":"string","value":"abcdefg"}, "key431":{"type":"string","value":"abcdefg"}, "key432":{"type":"string","value":"abcdefg"}, "key433":{"type":"string","value":"abcdefg"}, "key434":{"type":"string","value":"abcdefg"}, "key435":{"type":"string","value":"abcdefg"}, "key436":{"type":"string","value":"abcdefg"}, "key437":{"type":"string","value":"abcdefg"}, "key438":{"type":"string","value":"abcdefg"}, "key439":{"type":"string","value":"abcdefg"}, "key440":{"type":"string","value":"abcdefg"}, "key441":{"type":"string","value":"abcdefg"}, "key442":{"type":"string","value":"abcdefg"}, "key443":{"type":"string","value":"abcdefg"}, "key444":{"type":"string","value":"abcdefg"}, "key445":{"type":"string","value":"abcdefg"}, "key446":{"type":"string","value":"abcdefg"}, "key447":{"type":"string","value":"abcdefg"}, "key448":{"type":"string","value":"abcdefg"}, "key449":{"type":"string","value":"abcdefg"}, "key450":{"type":"string","value":"abcdefg"}, "key451":{"type":"string","value":"abcdefg"}, "key452":{"type":"string","value":"abcdefg"}, "key453":{"type":"string","value":"abcdefg"}, "key454":{"type":"string","value":"abcdefg"}, "key455":{"type":"string","value":"abcdefg"}, "key456":{"type":"string","value":"abcdefg"}, "key457":{"type":"string","value":"abcdefg"}, "key458":{"type":"string","value":"abcdefg"}, "key459":{"type":"string","value":"abcdefg"}, "key460":{"type":"string","value":"abcdefg"}, "key461":{"type":"string","value":"abcdefg"}, "key462":{"type":"string","value":"abcdefg"}, "key463":{"type":"string","value":"abcdefg"}, "key464":{"type":"string","value":"abcdefg"}, "key465":{"type":"string","value":"abcdefg"}, "key466":{"type":"string","value":"abcdefg"}, "key467":{"type":"string","value":"abcdefg"}, "key468":{"type":"string","value":"abcdefg"}, "key469":{"type":"string","value":"abcdefg"}, "key470":{"type":"string","value":"abcdefg"}, "key471":{"type":"string","value":"abcdefg"}, "key472":{"type":"string","value":"abcdefg"}, "key473":{"type":"string","value":"abcdefg"}, "key474":{"type":"string","value":"abcdefg"}, "key475":{"type":"string","value":"abcdefg"}, "key476":{"type":"string","value":"abcdefg"}, "key477":{"type":"string","value":"abcdefg"}, "key478":{"type":"string","value":"abcdefg"}, "key479":{"type":"string","value":"abcdefg"}, "key480":{"type":"string","value":"abcdefg"}, "key481":{"type":"string","value":"abcdefg"}, "key482":{"type":"string","value":"abcdefg"}, "key483":{"type":"string","value":"abcdefg"}, "key484":{"type":"string","value":"abcdefg"}, "key485":{"type":"string","value":"abcdefg"}, "key486":{"type":"string","value":"abcdefg"}, "key487":{"type":"string","value":"abcdefg"}, "key488":{"type":"string","value":"abcdefg"}, "key489":{"type":"string","value":"abcdefg"}, "key490":{"type":"string","value":"abcdefg"}, "key491":{"type":"string","value":"abcdefg"}, "key492":{"type":"string","value":"abcdefg"}, "key493":{"type":"string","value":"abcdefg"}, "key494":{"type":"string","value":"abcdefg"}, "key495":{"type":"string","value":"abcdefg"}, "key496":{"type":"string","value":"abcdefg"}, "key497":{"type":"string","value":"abcdefg"}, "key498":{"type":"string","value":"abcdefg"}, "key499":{"type":"string","value":"abcdefg"}, "key500":{"type":"string","value":"abcdefg"}, "key501":{"type":"string","value":"abcdefg"}, "key502":{"type":"string","value":"abcdefg"}, "key503":{"type":"string","value":"abcdefg"}, "key504":{"type":"string","value":"abcdefg"}, "key505":{"type":"string","value":"abcdefg"}, "key506":{"type":"string","value":"abcdefg"}, "key507":{"type":"string","value":"abcdefg"}, "key508":{"type":"string","value":"abcdefg"}, "key509":{"type":"string","value":"abcdefg"}, "key510":{"type":"string","value":"abcdefg"}, "key511":{"type":"string","value":"abcdefg"}, "key512":{"type":"string","value":"abcdefg"}, "key513":{"type":"string","value":"abcdefg"}, "key514":{"type":"string","value":"abcdefg"}, "key515":{"type":"string","value":"abcdefg"}, "key516":{"type":"string","value":"abcdefg"}, "key517":{"type":"string","value":"abcdefg"}, "key518":{"type":"string","value":"abcdefg"}, "key519":{"type":"string","value":"abcdefg"}, "key520":{"type":"string","value":"abcdefg"}, "key521":{"type":"string","value":"abcdefg"}, "key522":{"type":"string","value":"abcdefg"}, "key523":{"type":"string","value":"abcdefg"}, "key524":{"type":"string","value":"abcdefg"}, "key525":{"type":"string","value":"abcdefg"}, "key526":{"type":"string","value":"abcdefg"}, "key527":{"type":"string","value":"abcdefg"}, "key528":{"type":"string","value":"abcdefg"}, "key529":{"type":"string","value":"abcdefg"}, "key530":{"type":"string","value":"abcdefg"}, "key531":{"type":"string","value":"abcdefg"}, "key532":{"type":"string","value":"abcdefg"}, "key533":{"type":"string","value":"abcdefg"}, "key534":{"type":"string","value":"abcdefg"}, "key535":{"type":"string","value":"abcdefg"}, "key536":{"type":"string","value":"abcdefg"}, "key537":{"type":"string","value":"abcdefg"}, "key538":{"type":"string","value":"abcdefg"}, "key539":{"type":"string","value":"abcdefg"}, "key540":{"type":"string","value":"abcdefg"}, "key541":{"type":"string","value":"abcdefg"}, "key542":{"type":"string","value":"abcdefg"}, "key543":{"type":"string","value":"abcdefg"}, "key544":{"type":"string","value":"abcdefg"}, "key545":{"type":"string","value":"abcdefg"}, "key546":{"type":"string","value":"abcdefg"}, "key547":{"type":"string","value":"abcdefg"}, "key548":{"type":"string","value":"abcdefg"}, "key549":{"type":"string","value":"abcdefg"}, "key550":{"type":"string","value":"abcdefg"}, "key551":{"type":"string","value":"abcdefg"}, "key552":{"type":"string","value":"abcdefg"}, "key553":{"type":"string","value":"abcdefg"}, "key554":{"type":"string","value":"abcdefg"}, "key555":{"type":"string","value":"abcdefg"}, "key556":{"type":"string","value":"abcdefg"}, "key557":{"type":"string","value":"abcdefg"}, "key558":{"type":"string","value":"abcdefg"}, "key559":{"type":"string","value":"abcdefg"}, "key560":{"type":"string","value":"abcdefg"}, "key561":{"type":"string","value":"abcdefg"}, "key562":{"type":"string","value":"abcdefg"}, "key563":{"type":"string","value":"abcdefg"}, "key564":{"type":"string","value":"abcdefg"}, "key565":{"type":"string","value":"abcdefg"}, "key566":{"type":"string","value":"abcdefg"}, "key567":{"type":"string","value":"abcdefg"}, "key568":{"type":"string","value":"abcdefg"}, "key569":{"type":"string","value":"abcdefg"}, "key570":{"type":"string","value":"abcdefg"}, "key571":{"type":"string","value":"abcdefg"}, "key572":{"type":"string","value":"abcdefg"}, "key573":{"type":"string","value":"abcdefg"}, "key574":{"type":"string","value":"abcdefg"}, "key575":{"type":"string","value":"abcdefg"}, "key576":{"type":"string","value":"abcdefg"}, "key577":{"type":"string","value":"abcdefg"}, "key578":{"type":"string","value":"abcdefg"}, "key579":{"type":"string","value":"abcdefg"}, "key580":{"type":"string","value":"abcdefg"}, "key581":{"type":"string","value":"abcdefg"}, "key582":{"type":"string","value":"abcdefg"}, "key583":{"type":"string","value":"abcdefg"}, "key584":{"type":"string","value":"abcdefg"}, "key585":{"type":"string","value":"abcdefg"}, "key586":{"type":"string","value":"abcdefg"}, "key587":{"type":"string","value":"abcdefg"}, "key588":{"type":"string","value":"abcdefg"}, "key589":{"type":"string","value":"abcdefg"}, "key590":{"type":"string","value":"abcdefg"}, "key591":{"type":"string","value":"abcdefg"}, "key592":{"type":"string","value":"abcdefg"}, "key593":{"type":"string","value":"abcdefg"}, "key594":{"type":"string","value":"abcdefg"}, "key595":{"type":"string","value":"abcdefg"}, "key596":{"type":"string","value":"abcdefg"}, "key597":{"type":"string","value":"abcdefg"}, "key598":{"type":"string","value":"abcdefg"}, "key599":{"type":"string","value":"abcdefg"}, "key600":{"type":"string","value":"abcdefg"}, "key601":{"type":"string","value":"abcdefg"}, "key602":{"type":"string","value":"abcdefg"}, "key603":{"type":"string","value":"abcdefg"}, "key604":{"type":"string","value":"abcdefg"}, "key605":{"type":"string","value":"abcdefg"}, "key606":{"type":"string","value":"abcdefg"}, "key607":{"type":"string","value":"abcdefg"}, "key608":{"type":"string","value":"abcdefg"}, "key609":{"type":"string","value":"abcdefg"}, "key610":{"type":"string","value":"abcdefg"}, "key611":{"type":"string","value":"abcdefg"}, "key612":{"type":"string","value":"abcdefg"}, "key613":{"type":"string","value":"abcdefg"}, "key614":{"type":"string","value":"abcdefg"}, "key615":{"type":"string","value":"abcdefg"}, "key616":{"type":"string","value":"abcdefg"}, "key617":{"type":"string","value":"abcdefg"}, "key618":{"type":"string","value":"abcdefg"}, "key619":{"type":"string","value":"abcdefg"}, "key620":{"type":"string","value":"abcdefg"}, "key621":{"type":"string","value":"abcdefg"}, "key622":{"type":"string","value":"abcdefg"}, "key623":{"type":"string","value":"abcdefg"}, "key624":{"type":"string","value":"abcdefg"}, "key625":{"type":"string","value":"abcdefg"}, "key626":{"type":"string","value":"abcdefg"}, "key627":{"type":"string","value":"abcdefg"}, "key628":{"type":"string","value":"abcdefg"}, "key629":{"type":"string","value":"abcdefg"}, "key630":{"type":"string","value":"abcdefg"}, "key631":{"type":"string","value":"abcdefg"}, "key632":{"type":"string","value":"abcdefg"}, "key633":{"type":"string","value":"abcdefg"}, "key634":{"type":"string","value":"abcdefg"}, "key635":{"type":"string","value":"abcdefg"}, "key636":{"type":"string","value":"abcdefg"}, "key637":{"type":"string","value":"abcdefg"}, "key638":{"type":"string","value":"abcdefg"}, "key639":{"type":"string","value":"abcdefg"}, "key640":{"type":"string","value":"abcdefg"}, "key641":{"type":"string","value":"abcdefg"}, "key642":{"type":"string","value":"abcdefg"}, "key643":{"type":"string","value":"abcdefg"}, "key644":{"type":"string","value":"abcdefg"}, "key645":{"type":"string","value":"abcdefg"}, "key646":{"type":"string","value":"abcdefg"}, "key647":{"type":"string","value":"abcdefg"}, "key648":{"type":"string","value":"abcdefg"}, "key649":{"type":"string","value":"abcdefg"}, "key650":{"type":"string","value":"abcdefg"}, "key651":{"type":"string","value":"abcdefg"}, "key652":{"type":"string","value":"abcdefg"}, "key653":{"type":"string","value":"abcdefg"}, "key654":{"type":"string","value":"abcdefg"}, "key655":{"type":"string","value":"abcdefg"}, "key656":{"type":"string","value":"abcdefg"}, "key657":{"type":"string","value":"abcdefg"}, "key658":{"type":"string","value":"abcdefg"}, "key659":{"type":"string","value":"abcdefg"}, "key660":{"type":"string","value":"abcdefg"}, "key661":{"type":"string","value":"abcdefg"}, "key662":{"type":"string","value":"abcdefg"}, "key663":{"type":"string","value":"abcdefg"}, "key664":{"type":"string","value":"abcdefg"}, "key665":{"type":"string","value":"abcdefg"}, "key666":{"type":"string","value":"abcdefg"}, "key667":{"type":"string","value":"abcdefg"}, "key668":{"type":"string","value":"abcdefg"}, "key669":{"type":"string","value":"abcdefg"}, "key670":{"type":"string","value":"abcdefg"}, "key671":{"type":"string","value":"abcdefg"}, "key672":{"type":"string","value":"abcdefg"}, "key673":{"type":"string","value":"abcdefg"}, "key674":{"type":"string","value":"abcdefg"}, "key675":{"type":"string","value":"abcdefg"}, "key676":{"type":"string","value":"abcdefg"}, "key677":{"type":"string","value":"abcdefg"}, "key678":{"type":"string","value":"abcdefg"}, "key679":{"type":"string","value":"abcdefg"}, "key680":{"type":"string","value":"abcdefg"}, "key681":{"type":"string","value":"abcdefg"}, "key682":{"type":"string","value":"abcdefg"}, "key683":{"type":"string","value":"abcdefg"}, "key684":{"type":"string","value":"abcdefg"}, "key685":{"type":"string","value":"abcdefg"}, "key686":{"type":"string","value":"abcdefg"}, "key687":{"type":"string","value":"abcdefg"}, "key688":{"type":"string","value":"abcdefg"}, "key689":{"type":"string","value":"abcdefg"}, "key690":{"type":"string","value":"abcdefg"}, "key691":{"type":"string","value":"abcdefg"}, "key692":{"type":"string","value":"abcdefg"}, "key693":{"type":"string","value":"abcdefg"}, "key694":{"type":"string","value":"abcdefg"}, "key695":{"type":"string","value":"abcdefg"}, "key696":{"type":"string","value":"abcdefg"}, "key697":{"type":"string","value":"abcdefg"}, "key698":{"type":"string","value":"abcdefg"}, "key699":{"type":"string","value":"abcdefg"}, "key700":{"type":"string","value":"abcdefg"}, "key701":{"type":"string","value":"abcdefg"}, "key702":{"type":"string","value":"abcdefg"}, "key703":{"type":"string","value":"abcdefg"}, "key704":{"type":"string","value":"abcdefg"}, "key705":{"type":"string","value":"abcdefg"}, "key706":{"type":"string","value":"abcdefg"}, "key707":{"type":"string","value":"abcdefg"}, "key708":{"type":"string","value":"abcdefg"}, "key709":{"type":"string","value":"abcdefg"}, "key710":{"type":"string","value":"abcdefg"}, "key711":{"type":"string","value":"abcdefg"}, "key712":{"type":"string","value":"abcdefg"}, "key713":{"type":"string","value":"abcdefg"}, "key714":{"type":"string","value":"abcdefg"}, "key715":{"type":"string","value":"abcdefg"}, "key716":{"type":"string","value":"abcdefg"}, "key717":{"type":"string","value":"abcdefg"}, "key718":{"type":"string","value":"abcdefg"}, "key719":{"type":"string","value":"abcdefg"}, "key720":{"type":"string","value":"abcdefg"}, "key721":{"type":"string","value":"abcdefg"}, "key722":{"type":"string","value":"abcdefg"}, "key723":{"type":"string","value":"abcdefg"}, "key724":{"type":"string","value":"abcdefg"}, "key725":{"type":"string","value":"abcdefg"}, "key726":{"type":"string","value":"abcdefg"}, "key727":{"type":"string","value":"abcdefg"}, "key728":{"type":"string","value":"abcdefg"}, "key729":{"type":"string","value":"abcdefg"}, "key730":{"type":"string","value":"abcdefg"}, "key731":{"type":"string","value":"abcdefg"}, "key732":{"type":"string","value":"abcdefg"}, "key733":{"type":"string","value":"abcdefg"}, "key734":{"type":"string","value":"abcdefg"}, "key735":{"type":"string","value":"abcdefg"}, "key736":{"type":"string","value":"abcdefg"}, "key737":{"type":"string","value":"abcdefg"}, "key738":{"type":"string","value":"abcdefg"}, "key739":{"type":"string","value":"abcdefg"}, "key740":{"type":"string","value":"abcdefg"}, "key741":{"type":"string","value":"abcdefg"}, "key742":{"type":"string","value":"abcdefg"}, "key743":{"type":"string","value":"abcdefg"}, "key744":{"type":"string","value":"abcdefg"}, "key745":{"type":"string","value":"abcdefg"}, "key746":{"type":"string","value":"abcdefg"}, "key747":{"type":"string","value":"abcdefg"}, "key748":{"type":"string","value":"abcdefg"}, "key749":{"type":"string","value":"abcdefg"}, "key750":{"type":"string","value":"abcdefg"}, "key751":{"type":"string","value":"abcdefg"}, "key752":{"type":"string","value":"abcdefg"}, "key753":{"type":"string","value":"abcdefg"}, "key754":{"type":"string","value":"abcdefg"}, "key755":{"type":"string","value":"abcdefg"}, "key756":{"type":"string","value":"abcdefg"}, "key757":{"type":"string","value":"abcdefg"}, "key758":{"type":"string","value":"abcdefg"}, "key759":{"type":"string","value":"abcdefg"}, "key760":{"type":"string","value":"abcdefg"}, "key761":{"type":"string","value":"abcdefg"}, "key762":{"type":"string","value":"abcdefg"}, "key763":{"type":"string","value":"abcdefg"}, "key764":{"type":"string","value":"abcdefg"}, "key765":{"type":"string","value":"abcdefg"}, "key766":{"type":"string","value":"abcdefg"}, "key767":{"type":"string","value":"abcdefg"}, "key768":{"type":"string","value":"abcdefg"}, "key769":{"type":"string","value":"abcdefg"}, "key770":{"type":"string","value":"abcdefg"}, "key771":{"type":"string","value":"abcdefg"}, "key772":{"type":"string","value":"abcdefg"}, "key773":{"type":"string","value":"abcdefg"}, "key774":{"type":"string","value":"abcdefg"}, "key775":{"type":"string","value":"abcdefg"}, "key776":{"type":"string","value":"abcdefg"}, "key777":{"type":"string","value":"abcdefg"}, "key778":{"type":"string","value":"abcdefg"}, "key779":{"type":"string","value":"abcdefg"}, "key780":{"type":"string","value":"abcdefg"}, "key781":{"type":"string","value":"abcdefg"}, "key782":{"type":"string","value":"abcdefg"}, "key783":{"type":"string","value":"abcdefg"}, "key784":{"type":"string","value":"abcdefg"}, "key785":{"type":"string","value":"abcdefg"}, "key786":{"type":"string","value":"abcdefg"}, "key787":{"type":"string","value":"abcdefg"}, "key788":{"type":"string","value":"abcdefg"}, "key789":{"type":"string","value":"abcdefg"}, "key790":{"type":"string","value":"abcdefg"}, "key791":{"type":"string","value":"abcdefg"}, "key792":{"type":"string","value":"abcdefg"}, "key793":{"type":"string","value":"abcdefg"}, "key794":{"type":"string","value":"abcdefg"}, "key795":{"type":"string","value":"abcdefg"}, "key796":{"type":"string","value":"abcdefg"}, "key797":{"type":"string","value":"abcdefg"}, "key798":{"type":"string","value":"abcdefg"}, "key799":{"type":"string","value":"abcdefg"}, "key800":{"type":"string","value":"abcdefg"}, "key801":{"type":"string","value":"abcdefg"}, "key802":{"type":"string","value":"abcdefg"}, "key803":{"type":"string","value":"abcdefg"}, "key804":{"type":"string","value":"abcdefg"}, "key805":{"type":"string","value":"abcdefg"}, "key806":{"type":"string","value":"abcdefg"}, "key807":{"type":"string","value":"abcdefg"}, "key808":{"type":"string","value":"abcdefg"}, "key809":{"type":"string","value":"abcdefg"}, "key810":{"type":"string","value":"abcdefg"}, "key811":{"type":"string","value":"abcdefg"}, "key812":{"type":"string","value":"abcdefg"}, "key813":{"type":"string","value":"abcdefg"}, "key814":{"type":"string","value":"abcdefg"}, "key815":{"type":"string","value":"abcdefg"}, "key816":{"type":"string","value":"abcdefg"}, "key817":{"type":"string","value":"abcdefg"}, "key818":{"type":"string","value":"abcdefg"}, "key819":{"type":"string","value":"abcdefg"}, "key820":{"type":"string","value":"abcdefg"}, "key821":{"type":"string","value":"abcdefg"}, "key822":{"type":"string","value":"abcdefg"}, "key823":{"type":"string","value":"abcdefg"}, "key824":{"type":"string","value":"abcdefg"}, "key825":{"type":"string","value":"abcdefg"}, "key826":{"type":"string","value":"abcdefg"}, "key827":{"type":"string","value":"abcdefg"}, "key828":{"type":"string","value":"abcdefg"}, "key829":{"type":"string","value":"abcdefg"}, "key830":{"type":"string","value":"abcdefg"}, "key831":{"type":"string","value":"abcdefg"}, "key832":{"type":"string","value":"abcdefg"}, "key833":{"type":"string","value":"abcdefg"}, "key834":{"type":"string","value":"abcdefg"}, "key835":{"type":"string","value":"abcdefg"}, "key836":{"type":"string","value":"abcdefg"}, "key837":{"type":"string","value":"abcdefg"}, "key838":{"type":"string","value":"abcdefg"}, "key839":{"type":"string","value":"abcdefg"}, "key840":{"type":"string","value":"abcdefg"}, "key841":{"type":"string","value":"abcdefg"}, "key842":{"type":"string","value":"abcdefg"}, "key843":{"type":"string","value":"abcdefg"}, "key844":{"type":"string","value":"abcdefg"}, "key845":{"type":"string","value":"abcdefg"}, "key846":{"type":"string","value":"abcdefg"}, "key847":{"type":"string","value":"abcdefg"}, "key848":{"type":"string","value":"abcdefg"}, "key849":{"type":"string","value":"abcdefg"}, "key850":{"type":"string","value":"abcdefg"}, "key851":{"type":"string","value":"abcdefg"}, "key852":{"type":"string","value":"abcdefg"}, "key853":{"type":"string","value":"abcdefg"}, "key854":{"type":"string","value":"abcdefg"}, "key855":{"type":"string","value":"abcdefg"}, "key856":{"type":"string","value":"abcdefg"}, "key857":{"type":"string","value":"abcdefg"}, "key858":{"type":"string","value":"abcdefg"}, "key859":{"type":"string","value":"abcdefg"}, "key860":{"type":"string","value":"abcdefg"}, "key861":{"type":"string","value":"abcdefg"}, "key862":{"type":"string","value":"abcdefg"}, "key863":{"type":"string","value":"abcdefg"}, "key864":{"type":"string","value":"abcdefg"}, "key865":{"type":"string","value":"abcdefg"}, "key866":{"type":"string","value":"abcdefg"}, "key867":{"type":"string","value":"abcdefg"}, "key868":{"type":"string","value":"abcdefg"}, "key869":{"type":"string","value":"abcdefg"}, "key870":{"type":"string","value":"abcdefg"}, "key871":{"type":"string","value":"abcdefg"}, "key872":{"type":"string","value":"abcdefg"}, "key873":{"type":"string","value":"abcdefg"}, "key874":{"type":"string","value":"abcdefg"}, "key875":{"type":"string","value":"abcdefg"}, "key876":{"type":"string","value":"abcdefg"}, "key877":{"type":"string","value":"abcdefg"}, "key878":{"type":"string","value":"abcdefg"}, "key879":{"type":"string","value":"abcdefg"}, "key880":{"type":"string","value":"abcdefg"}, "key881":{"type":"string","value":"abcdefg"}, "key882":{"type":"string","value":"abcdefg"}, "key883":{"type":"string","value":"abcdefg"}, "key884":{"type":"string","value":"abcdefg"}, "key885":{"type":"string","value":"abcdefg"}, "key886":{"type":"string","value":"abcdefg"}, "key887":{"type":"string","value":"abcdefg"}, "key888":{"type":"string","value":"abcdefg"}, "key889":{"type":"string","value":"abcdefg"}, "key890":{"type":"string","value":"abcdefg"}, "key891":{"type":"string","value":"abcdefg"}, "key892":{"type":"string","value":"abcdefg"}, "key893":{"type":"string","value":"abcdefg"}, "key894":{"type":"string","value":"abcdefg"}, "key895":{"type":"string","value":"abcdefg"}, "key896":{"type":"string","value":"abcdefg"}, "key897":{"type":"string","value":"abcdefg"}, "key898":{"type":"string","value":"abcdefg"}, "key899":{"type":"string","value":"abcdefg"}, "key900":{"type":"string","value":"abcdefg"}, "key901":{"type":"string","value":"abcdefg"}, "key902":{"type":"string","value":"abcdefg"}, "key903":{"type":"string","value":"abcdefg"}, "key904":{"type":"string","value":"abcdefg"}, "key905":{"type":"string","value":"abcdefg"}, "key906":{"type":"string","value":"abcdefg"}, "key907":{"type":"string","value":"abcdefg"}, "key908":{"type":"string","value":"abcdefg"}, "key909":{"type":"string","value":"abcdefg"}, "key910":{"type":"string","value":"abcdefg"}, "key911":{"type":"string","value":"abcdefg"}, "key912":{"type":"string","value":"abcdefg"}, "key913":{"type":"string","value":"abcdefg"}, "key914":{"type":"string","value":"abcdefg"}, "key915":{"type":"string","value":"abcdefg"}, "key916":{"type":"string","value":"abcdefg"}, "key917":{"type":"string","value":"abcdefg"}, "key918":{"type":"string","value":"abcdefg"}, "key919":{"type":"string","value":"abcdefg"}, "key920":{"type":"string","value":"abcdefg"}, "key921":{"type":"string","value":"abcdefg"}, "key922":{"type":"string","value":"abcdefg"}, "key923":{"type":"string","value":"abcdefg"}, "key924":{"type":"string","value":"abcdefg"}, "key925":{"type":"string","value":"abcdefg"}, "key926":{"type":"string","value":"abcdefg"}, "key927":{"type":"string","value":"abcdefg"}, "key928":{"type":"string","value":"abcdefg"}, "key929":{"type":"string","value":"abcdefg"}, "key930":{"type":"string","value":"abcdefg"}, "key931":{"type":"string","value":"abcdefg"}, "key932":{"type":"string","value":"abcdefg"}, "key933":{"type":"string","value":"abcdefg"}, "key934":{"type":"string","value":"abcdefg"}, "key935":{"type":"string","value":"abcdefg"}, "key936":{"type":"string","value":"abcdefg"}, "key937":{"type":"string","value":"abcdefg"}, "key938":{"type":"string","value":"abcdefg"}, "key939":{"type":"string","value":"abcdefg"}, "key940":{"type":"string","value":"abcdefg"}, "key941":{"type":"string","value":"abcdefg"}, "key942":{"type":"string","value":"abcdefg"}, "key943":{"type":"string","value":"abcdefg"}, "key944":{"type":"string","value":"abcdefg"}, "key945":{"type":"string","value":"abcdefg"}, "key946":{"type":"string","value":"abcdefg"}, "key947":{"type":"string","value":"abcdefg"}, "key948":{"type":"string","value":"abcdefg"}, "key949":{"type":"string","value":"abcdefg"}, "key950":{"type":"string","value":"abcdefg"}, "key951":{"type":"string","value":"abcdefg"}, "key952":{"type":"string","value":"abcdefg"}, "key953":{"type":"string","value":"abcdefg"}, "key954":{"type":"string","value":"abcdefg"}, "key955":{"type":"string","value":"abcdefg"}, "key956":{"type":"string","value":"abcdefg"}, "key957":{"type":"string","value":"abcdefg"}, "key958":{"type":"string","value":"abcdefg"}, "key959":{"type":"string","value":"abcdefg"}, "key960":{"type":"string","value":"abcdefg"}, "key961":{"type":"string","value":"abcdefg"}, "key962":{"type":"string","value":"abcdefg"}, "key963":{"type":"string","value":"abcdefg"}, "key964":{"type":"string","value":"abcdefg"}, "key965":{"type":"string","value":"abcdefg"}, "key966":{"type":"string","value":"abcdefg"}, "key967":{"type":"string","value":"abcdefg"}, "key968":{"type":"string","value":"abcdefg"}, "key969":{"type":"string","value":"abcdefg"}, "key970":{"type":"string","value":"abcdefg"}, "key971":{"type":"string","value":"abcdefg"}, "key972":{"type":"string","value":"abcdefg"}, "key973":{"type":"string","value":"abcdefg"}, "key974":{"type":"string","value":"abcdefg"}, "key975":{"type":"string","value":"abcdefg"}, "key976":{"type":"string","value":"abcdefg"}, "key977":{"type":"string","value":"abcdefg"}, "key978":{"type":"string","value":"abcdefg"}, "key979":{"type":"string","value":"abcdefg"}, "key980":{"type":"string","value":"abcdefg"}, "key981":{"type":"string","value":"abcdefg"}, "key982":{"type":"string","value":"abcdefg"}, "key983":{"type":"string","value":"abcdefg"}, "key984":{"type":"string","value":"abcdefg"}, "key985":{"type":"string","value":"abcdefg"}, "key986":{"type":"string","value":"abcdefg"}, "key987":{"type":"string","value":"abcdefg"}, "key988":{"type":"string","value":"abcdefg"}, "key989":{"type":"string","value":"abcdefg"}, "key990":{"type":"string","value":"abcdefg"}, "key991":{"type":"string","value":"abcdefg"}, "key992":{"type":"string","value":"abcdefg"}, "key993":{"type":"string","value":"abcdefg"}, "key994":{"type":"string","value":"abcdefg"}, "key995":{"type":"string","value":"abcdefg"}, "key996":{"type":"string","value":"abcdefg"}, "key997":{"type":"string","value":"abcdefg"}, "key998":{"type":"string","value":"abcdefg"}, "key999":{"type":"string","value":"abcdefg"}, "key1000":{"type":"string","value":"abcdefg"}, "end":{"type":"boolean","value":"true"}}}
diff --git a/tests/data/valid/toml-lang-compliance/valid/qa/qa-table-inline-1000.toml b/tests/data/valid/toml-lang-compliance/valid/qa/qa-table-inline-1000.toml
new file mode 100644
index 0000000..f0490f8
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/qa/qa-table-inline-1000.toml
@@ -0,0 +1 @@
+key = { key1 = "abcdefg", key2 = "abcdefg", key3 = "abcdefg", key4 = "abcdefg", key5 = "abcdefg", key6 = "abcdefg", key7 = "abcdefg", key8 = "abcdefg", key9 = "abcdefg", key10 = "abcdefg", key11 = "abcdefg", key12 = "abcdefg", key13 = "abcdefg", key14 = "abcdefg", key15 = "abcdefg", key16 = "abcdefg", key17 = "abcdefg", key18 = "abcdefg", key19 = "abcdefg", key20 = "abcdefg", key21 = "abcdefg", key22 = "abcdefg", key23 = "abcdefg", key24 = "abcdefg", key25 = "abcdefg", key26 = "abcdefg", key27 = "abcdefg", key28 = "abcdefg", key29 = "abcdefg", key30 = "abcdefg", key31 = "abcdefg", key32 = "abcdefg", key33 = "abcdefg", key34 = "abcdefg", key35 = "abcdefg", key36 = "abcdefg", key37 = "abcdefg", key38 = "abcdefg", key39 = "abcdefg", key40 = "abcdefg", key41 = "abcdefg", key42 = "abcdefg", key43 = "abcdefg", key44 = "abcdefg", key45 = "abcdefg", key46 = "abcdefg", key47 = "abcdefg", key48 = "abcdefg", key49 = "abcdefg", key50 = "abcdefg", key51 = "abcdefg", key52 = "abcdefg", key53 = "abcdefg", key54 = "abcdefg", key55 = "abcdefg", key56 = "abcdefg", key57 = "abcdefg", key58 = "abcdefg", key59 = "abcdefg", key60 = "abcdefg", key61 = "abcdefg", key62 = "abcdefg", key63 = "abcdefg", key64 = "abcdefg", key65 = "abcdefg", key66 = "abcdefg", key67 = "abcdefg", key68 = "abcdefg", key69 = "abcdefg", key70 = "abcdefg", key71 = "abcdefg", key72 = "abcdefg", key73 = "abcdefg", key74 = "abcdefg", key75 = "abcdefg", key76 = "abcdefg", key77 = "abcdefg", key78 = "abcdefg", key79 = "abcdefg", key80 = "abcdefg", key81 = "abcdefg", key82 = "abcdefg", key83 = "abcdefg", key84 = "abcdefg", key85 = "abcdefg", key86 = "abcdefg", key87 = "abcdefg", key88 = "abcdefg", key89 = "abcdefg", key90 = "abcdefg", key91 = "abcdefg", key92 = "abcdefg", key93 = "abcdefg", key94 = "abcdefg", key95 = "abcdefg", key96 = "abcdefg", key97 = "abcdefg", key98 = "abcdefg", key99 = "abcdefg", key100 = "abcdefg", key101 = "abcdefg", key102 = "abcdefg", key103 = "abcdefg", key104 = "abcdefg", key105 = "abcdefg", key106 = "abcdefg", key107 = "abcdefg", key108 = "abcdefg", key109 = "abcdefg", key110 = "abcdefg", key111 = "abcdefg", key112 = "abcdefg", key113 = "abcdefg", key114 = "abcdefg", key115 = "abcdefg", key116 = "abcdefg", key117 = "abcdefg", key118 = "abcdefg", key119 = "abcdefg", key120 = "abcdefg", key121 = "abcdefg", key122 = "abcdefg", key123 = "abcdefg", key124 = "abcdefg", key125 = "abcdefg", key126 = "abcdefg", key127 = "abcdefg", key128 = "abcdefg", key129 = "abcdefg", key130 = "abcdefg", key131 = "abcdefg", key132 = "abcdefg", key133 = "abcdefg", key134 = "abcdefg", key135 = "abcdefg", key136 = "abcdefg", key137 = "abcdefg", key138 = "abcdefg", key139 = "abcdefg", key140 = "abcdefg", key141 = "abcdefg", key142 = "abcdefg", key143 = "abcdefg", key144 = "abcdefg", key145 = "abcdefg", key146 = "abcdefg", key147 = "abcdefg", key148 = "abcdefg", key149 = "abcdefg", key150 = "abcdefg", key151 = "abcdefg", key152 = "abcdefg", key153 = "abcdefg", key154 = "abcdefg", key155 = "abcdefg", key156 = "abcdefg", key157 = "abcdefg", key158 = "abcdefg", key159 = "abcdefg", key160 = "abcdefg", key161 = "abcdefg", key162 = "abcdefg", key163 = "abcdefg", key164 = "abcdefg", key165 = "abcdefg", key166 = "abcdefg", key167 = "abcdefg", key168 = "abcdefg", key169 = "abcdefg", key170 = "abcdefg", key171 = "abcdefg", key172 = "abcdefg", key173 = "abcdefg", key174 = "abcdefg", key175 = "abcdefg", key176 = "abcdefg", key177 = "abcdefg", key178 = "abcdefg", key179 = "abcdefg", key180 = "abcdefg", key181 = "abcdefg", key182 = "abcdefg", key183 = "abcdefg", key184 = "abcdefg", key185 = "abcdefg", key186 = "abcdefg", key187 = "abcdefg", key188 = "abcdefg", key189 = "abcdefg", key190 = "abcdefg", key191 = "abcdefg", key192 = "abcdefg", key193 = "abcdefg", key194 = "abcdefg", key195 = "abcdefg", key196 = "abcdefg", key197 = "abcdefg", key198 = "abcdefg", key199 = "abcdefg", key200 = "abcdefg", key201 = "abcdefg", key202 = "abcdefg", key203 = "abcdefg", key204 = "abcdefg", key205 = "abcdefg", key206 = "abcdefg", key207 = "abcdefg", key208 = "abcdefg", key209 = "abcdefg", key210 = "abcdefg", key211 = "abcdefg", key212 = "abcdefg", key213 = "abcdefg", key214 = "abcdefg", key215 = "abcdefg", key216 = "abcdefg", key217 = "abcdefg", key218 = "abcdefg", key219 = "abcdefg", key220 = "abcdefg", key221 = "abcdefg", key222 = "abcdefg", key223 = "abcdefg", key224 = "abcdefg", key225 = "abcdefg", key226 = "abcdefg", key227 = "abcdefg", key228 = "abcdefg", key229 = "abcdefg", key230 = "abcdefg", key231 = "abcdefg", key232 = "abcdefg", key233 = "abcdefg", key234 = "abcdefg", key235 = "abcdefg", key236 = "abcdefg", key237 = "abcdefg", key238 = "abcdefg", key239 = "abcdefg", key240 = "abcdefg", key241 = "abcdefg", key242 = "abcdefg", key243 = "abcdefg", key244 = "abcdefg", key245 = "abcdefg", key246 = "abcdefg", key247 = "abcdefg", key248 = "abcdefg", key249 = "abcdefg", key250 = "abcdefg", key251 = "abcdefg", key252 = "abcdefg", key253 = "abcdefg", key254 = "abcdefg", key255 = "abcdefg", key256 = "abcdefg", key257 = "abcdefg", key258 = "abcdefg", key259 = "abcdefg", key260 = "abcdefg", key261 = "abcdefg", key262 = "abcdefg", key263 = "abcdefg", key264 = "abcdefg", key265 = "abcdefg", key266 = "abcdefg", key267 = "abcdefg", key268 = "abcdefg", key269 = "abcdefg", key270 = "abcdefg", key271 = "abcdefg", key272 = "abcdefg", key273 = "abcdefg", key274 = "abcdefg", key275 = "abcdefg", key276 = "abcdefg", key277 = "abcdefg", key278 = "abcdefg", key279 = "abcdefg", key280 = "abcdefg", key281 = "abcdefg", key282 = "abcdefg", key283 = "abcdefg", key284 = "abcdefg", key285 = "abcdefg", key286 = "abcdefg", key287 = "abcdefg", key288 = "abcdefg", key289 = "abcdefg", key290 = "abcdefg", key291 = "abcdefg", key292 = "abcdefg", key293 = "abcdefg", key294 = "abcdefg", key295 = "abcdefg", key296 = "abcdefg", key297 = "abcdefg", key298 = "abcdefg", key299 = "abcdefg", key300 = "abcdefg", key301 = "abcdefg", key302 = "abcdefg", key303 = "abcdefg", key304 = "abcdefg", key305 = "abcdefg", key306 = "abcdefg", key307 = "abcdefg", key308 = "abcdefg", key309 = "abcdefg", key310 = "abcdefg", key311 = "abcdefg", key312 = "abcdefg", key313 = "abcdefg", key314 = "abcdefg", key315 = "abcdefg", key316 = "abcdefg", key317 = "abcdefg", key318 = "abcdefg", key319 = "abcdefg", key320 = "abcdefg", key321 = "abcdefg", key322 = "abcdefg", key323 = "abcdefg", key324 = "abcdefg", key325 = "abcdefg", key326 = "abcdefg", key327 = "abcdefg", key328 = "abcdefg", key329 = "abcdefg", key330 = "abcdefg", key331 = "abcdefg", key332 = "abcdefg", key333 = "abcdefg", key334 = "abcdefg", key335 = "abcdefg", key336 = "abcdefg", key337 = "abcdefg", key338 = "abcdefg", key339 = "abcdefg", key340 = "abcdefg", key341 = "abcdefg", key342 = "abcdefg", key343 = "abcdefg", key344 = "abcdefg", key345 = "abcdefg", key346 = "abcdefg", key347 = "abcdefg", key348 = "abcdefg", key349 = "abcdefg", key350 = "abcdefg", key351 = "abcdefg", key352 = "abcdefg", key353 = "abcdefg", key354 = "abcdefg", key355 = "abcdefg", key356 = "abcdefg", key357 = "abcdefg", key358 = "abcdefg", key359 = "abcdefg", key360 = "abcdefg", key361 = "abcdefg", key362 = "abcdefg", key363 = "abcdefg", key364 = "abcdefg", key365 = "abcdefg", key366 = "abcdefg", key367 = "abcdefg", key368 = "abcdefg", key369 = "abcdefg", key370 = "abcdefg", key371 = "abcdefg", key372 = "abcdefg", key373 = "abcdefg", key374 = "abcdefg", key375 = "abcdefg", key376 = "abcdefg", key377 = "abcdefg", key378 = "abcdefg", key379 = "abcdefg", key380 = "abcdefg", key381 = "abcdefg", key382 = "abcdefg", key383 = "abcdefg", key384 = "abcdefg", key385 = "abcdefg", key386 = "abcdefg", key387 = "abcdefg", key388 = "abcdefg", key389 = "abcdefg", key390 = "abcdefg", key391 = "abcdefg", key392 = "abcdefg", key393 = "abcdefg", key394 = "abcdefg", key395 = "abcdefg", key396 = "abcdefg", key397 = "abcdefg", key398 = "abcdefg", key399 = "abcdefg", key400 = "abcdefg", key401 = "abcdefg", key402 = "abcdefg", key403 = "abcdefg", key404 = "abcdefg", key405 = "abcdefg", key406 = "abcdefg", key407 = "abcdefg", key408 = "abcdefg", key409 = "abcdefg", key410 = "abcdefg", key411 = "abcdefg", key412 = "abcdefg", key413 = "abcdefg", key414 = "abcdefg", key415 = "abcdefg", key416 = "abcdefg", key417 = "abcdefg", key418 = "abcdefg", key419 = "abcdefg", key420 = "abcdefg", key421 = "abcdefg", key422 = "abcdefg", key423 = "abcdefg", key424 = "abcdefg", key425 = "abcdefg", key426 = "abcdefg", key427 = "abcdefg", key428 = "abcdefg", key429 = "abcdefg", key430 = "abcdefg", key431 = "abcdefg", key432 = "abcdefg", key433 = "abcdefg", key434 = "abcdefg", key435 = "abcdefg", key436 = "abcdefg", key437 = "abcdefg", key438 = "abcdefg", key439 = "abcdefg", key440 = "abcdefg", key441 = "abcdefg", key442 = "abcdefg", key443 = "abcdefg", key444 = "abcdefg", key445 = "abcdefg", key446 = "abcdefg", key447 = "abcdefg", key448 = "abcdefg", key449 = "abcdefg", key450 = "abcdefg", key451 = "abcdefg", key452 = "abcdefg", key453 = "abcdefg", key454 = "abcdefg", key455 = "abcdefg", key456 = "abcdefg", key457 = "abcdefg", key458 = "abcdefg", key459 = "abcdefg", key460 = "abcdefg", key461 = "abcdefg", key462 = "abcdefg", key463 = "abcdefg", key464 = "abcdefg", key465 = "abcdefg", key466 = "abcdefg", key467 = "abcdefg", key468 = "abcdefg", key469 = "abcdefg", key470 = "abcdefg", key471 = "abcdefg", key472 = "abcdefg", key473 = "abcdefg", key474 = "abcdefg", key475 = "abcdefg", key476 = "abcdefg", key477 = "abcdefg", key478 = "abcdefg", key479 = "abcdefg", key480 = "abcdefg", key481 = "abcdefg", key482 = "abcdefg", key483 = "abcdefg", key484 = "abcdefg", key485 = "abcdefg", key486 = "abcdefg", key487 = "abcdefg", key488 = "abcdefg", key489 = "abcdefg", key490 = "abcdefg", key491 = "abcdefg", key492 = "abcdefg", key493 = "abcdefg", key494 = "abcdefg", key495 = "abcdefg", key496 = "abcdefg", key497 = "abcdefg", key498 = "abcdefg", key499 = "abcdefg", key500 = "abcdefg", key501 = "abcdefg", key502 = "abcdefg", key503 = "abcdefg", key504 = "abcdefg", key505 = "abcdefg", key506 = "abcdefg", key507 = "abcdefg", key508 = "abcdefg", key509 = "abcdefg", key510 = "abcdefg", key511 = "abcdefg", key512 = "abcdefg", key513 = "abcdefg", key514 = "abcdefg", key515 = "abcdefg", key516 = "abcdefg", key517 = "abcdefg", key518 = "abcdefg", key519 = "abcdefg", key520 = "abcdefg", key521 = "abcdefg", key522 = "abcdefg", key523 = "abcdefg", key524 = "abcdefg", key525 = "abcdefg", key526 = "abcdefg", key527 = "abcdefg", key528 = "abcdefg", key529 = "abcdefg", key530 = "abcdefg", key531 = "abcdefg", key532 = "abcdefg", key533 = "abcdefg", key534 = "abcdefg", key535 = "abcdefg", key536 = "abcdefg", key537 = "abcdefg", key538 = "abcdefg", key539 = "abcdefg", key540 = "abcdefg", key541 = "abcdefg", key542 = "abcdefg", key543 = "abcdefg", key544 = "abcdefg", key545 = "abcdefg", key546 = "abcdefg", key547 = "abcdefg", key548 = "abcdefg", key549 = "abcdefg", key550 = "abcdefg", key551 = "abcdefg", key552 = "abcdefg", key553 = "abcdefg", key554 = "abcdefg", key555 = "abcdefg", key556 = "abcdefg", key557 = "abcdefg", key558 = "abcdefg", key559 = "abcdefg", key560 = "abcdefg", key561 = "abcdefg", key562 = "abcdefg", key563 = "abcdefg", key564 = "abcdefg", key565 = "abcdefg", key566 = "abcdefg", key567 = "abcdefg", key568 = "abcdefg", key569 = "abcdefg", key570 = "abcdefg", key571 = "abcdefg", key572 = "abcdefg", key573 = "abcdefg", key574 = "abcdefg", key575 = "abcdefg", key576 = "abcdefg", key577 = "abcdefg", key578 = "abcdefg", key579 = "abcdefg", key580 = "abcdefg", key581 = "abcdefg", key582 = "abcdefg", key583 = "abcdefg", key584 = "abcdefg", key585 = "abcdefg", key586 = "abcdefg", key587 = "abcdefg", key588 = "abcdefg", key589 = "abcdefg", key590 = "abcdefg", key591 = "abcdefg", key592 = "abcdefg", key593 = "abcdefg", key594 = "abcdefg", key595 = "abcdefg", key596 = "abcdefg", key597 = "abcdefg", key598 = "abcdefg", key599 = "abcdefg", key600 = "abcdefg", key601 = "abcdefg", key602 = "abcdefg", key603 = "abcdefg", key604 = "abcdefg", key605 = "abcdefg", key606 = "abcdefg", key607 = "abcdefg", key608 = "abcdefg", key609 = "abcdefg", key610 = "abcdefg", key611 = "abcdefg", key612 = "abcdefg", key613 = "abcdefg", key614 = "abcdefg", key615 = "abcdefg", key616 = "abcdefg", key617 = "abcdefg", key618 = "abcdefg", key619 = "abcdefg", key620 = "abcdefg", key621 = "abcdefg", key622 = "abcdefg", key623 = "abcdefg", key624 = "abcdefg", key625 = "abcdefg", key626 = "abcdefg", key627 = "abcdefg", key628 = "abcdefg", key629 = "abcdefg", key630 = "abcdefg", key631 = "abcdefg", key632 = "abcdefg", key633 = "abcdefg", key634 = "abcdefg", key635 = "abcdefg", key636 = "abcdefg", key637 = "abcdefg", key638 = "abcdefg", key639 = "abcdefg", key640 = "abcdefg", key641 = "abcdefg", key642 = "abcdefg", key643 = "abcdefg", key644 = "abcdefg", key645 = "abcdefg", key646 = "abcdefg", key647 = "abcdefg", key648 = "abcdefg", key649 = "abcdefg", key650 = "abcdefg", key651 = "abcdefg", key652 = "abcdefg", key653 = "abcdefg", key654 = "abcdefg", key655 = "abcdefg", key656 = "abcdefg", key657 = "abcdefg", key658 = "abcdefg", key659 = "abcdefg", key660 = "abcdefg", key661 = "abcdefg", key662 = "abcdefg", key663 = "abcdefg", key664 = "abcdefg", key665 = "abcdefg", key666 = "abcdefg", key667 = "abcdefg", key668 = "abcdefg", key669 = "abcdefg", key670 = "abcdefg", key671 = "abcdefg", key672 = "abcdefg", key673 = "abcdefg", key674 = "abcdefg", key675 = "abcdefg", key676 = "abcdefg", key677 = "abcdefg", key678 = "abcdefg", key679 = "abcdefg", key680 = "abcdefg", key681 = "abcdefg", key682 = "abcdefg", key683 = "abcdefg", key684 = "abcdefg", key685 = "abcdefg", key686 = "abcdefg", key687 = "abcdefg", key688 = "abcdefg", key689 = "abcdefg", key690 = "abcdefg", key691 = "abcdefg", key692 = "abcdefg", key693 = "abcdefg", key694 = "abcdefg", key695 = "abcdefg", key696 = "abcdefg", key697 = "abcdefg", key698 = "abcdefg", key699 = "abcdefg", key700 = "abcdefg", key701 = "abcdefg", key702 = "abcdefg", key703 = "abcdefg", key704 = "abcdefg", key705 = "abcdefg", key706 = "abcdefg", key707 = "abcdefg", key708 = "abcdefg", key709 = "abcdefg", key710 = "abcdefg", key711 = "abcdefg", key712 = "abcdefg", key713 = "abcdefg", key714 = "abcdefg", key715 = "abcdefg", key716 = "abcdefg", key717 = "abcdefg", key718 = "abcdefg", key719 = "abcdefg", key720 = "abcdefg", key721 = "abcdefg", key722 = "abcdefg", key723 = "abcdefg", key724 = "abcdefg", key725 = "abcdefg", key726 = "abcdefg", key727 = "abcdefg", key728 = "abcdefg", key729 = "abcdefg", key730 = "abcdefg", key731 = "abcdefg", key732 = "abcdefg", key733 = "abcdefg", key734 = "abcdefg", key735 = "abcdefg", key736 = "abcdefg", key737 = "abcdefg", key738 = "abcdefg", key739 = "abcdefg", key740 = "abcdefg", key741 = "abcdefg", key742 = "abcdefg", key743 = "abcdefg", key744 = "abcdefg", key745 = "abcdefg", key746 = "abcdefg", key747 = "abcdefg", key748 = "abcdefg", key749 = "abcdefg", key750 = "abcdefg", key751 = "abcdefg", key752 = "abcdefg", key753 = "abcdefg", key754 = "abcdefg", key755 = "abcdefg", key756 = "abcdefg", key757 = "abcdefg", key758 = "abcdefg", key759 = "abcdefg", key760 = "abcdefg", key761 = "abcdefg", key762 = "abcdefg", key763 = "abcdefg", key764 = "abcdefg", key765 = "abcdefg", key766 = "abcdefg", key767 = "abcdefg", key768 = "abcdefg", key769 = "abcdefg", key770 = "abcdefg", key771 = "abcdefg", key772 = "abcdefg", key773 = "abcdefg", key774 = "abcdefg", key775 = "abcdefg", key776 = "abcdefg", key777 = "abcdefg", key778 = "abcdefg", key779 = "abcdefg", key780 = "abcdefg", key781 = "abcdefg", key782 = "abcdefg", key783 = "abcdefg", key784 = "abcdefg", key785 = "abcdefg", key786 = "abcdefg", key787 = "abcdefg", key788 = "abcdefg", key789 = "abcdefg", key790 = "abcdefg", key791 = "abcdefg", key792 = "abcdefg", key793 = "abcdefg", key794 = "abcdefg", key795 = "abcdefg", key796 = "abcdefg", key797 = "abcdefg", key798 = "abcdefg", key799 = "abcdefg", key800 = "abcdefg", key801 = "abcdefg", key802 = "abcdefg", key803 = "abcdefg", key804 = "abcdefg", key805 = "abcdefg", key806 = "abcdefg", key807 = "abcdefg", key808 = "abcdefg", key809 = "abcdefg", key810 = "abcdefg", key811 = "abcdefg", key812 = "abcdefg", key813 = "abcdefg", key814 = "abcdefg", key815 = "abcdefg", key816 = "abcdefg", key817 = "abcdefg", key818 = "abcdefg", key819 = "abcdefg", key820 = "abcdefg", key821 = "abcdefg", key822 = "abcdefg", key823 = "abcdefg", key824 = "abcdefg", key825 = "abcdefg", key826 = "abcdefg", key827 = "abcdefg", key828 = "abcdefg", key829 = "abcdefg", key830 = "abcdefg", key831 = "abcdefg", key832 = "abcdefg", key833 = "abcdefg", key834 = "abcdefg", key835 = "abcdefg", key836 = "abcdefg", key837 = "abcdefg", key838 = "abcdefg", key839 = "abcdefg", key840 = "abcdefg", key841 = "abcdefg", key842 = "abcdefg", key843 = "abcdefg", key844 = "abcdefg", key845 = "abcdefg", key846 = "abcdefg", key847 = "abcdefg", key848 = "abcdefg", key849 = "abcdefg", key850 = "abcdefg", key851 = "abcdefg", key852 = "abcdefg", key853 = "abcdefg", key854 = "abcdefg", key855 = "abcdefg", key856 = "abcdefg", key857 = "abcdefg", key858 = "abcdefg", key859 = "abcdefg", key860 = "abcdefg", key861 = "abcdefg", key862 = "abcdefg", key863 = "abcdefg", key864 = "abcdefg", key865 = "abcdefg", key866 = "abcdefg", key867 = "abcdefg", key868 = "abcdefg", key869 = "abcdefg", key870 = "abcdefg", key871 = "abcdefg", key872 = "abcdefg", key873 = "abcdefg", key874 = "abcdefg", key875 = "abcdefg", key876 = "abcdefg", key877 = "abcdefg", key878 = "abcdefg", key879 = "abcdefg", key880 = "abcdefg", key881 = "abcdefg", key882 = "abcdefg", key883 = "abcdefg", key884 = "abcdefg", key885 = "abcdefg", key886 = "abcdefg", key887 = "abcdefg", key888 = "abcdefg", key889 = "abcdefg", key890 = "abcdefg", key891 = "abcdefg", key892 = "abcdefg", key893 = "abcdefg", key894 = "abcdefg", key895 = "abcdefg", key896 = "abcdefg", key897 = "abcdefg", key898 = "abcdefg", key899 = "abcdefg", key900 = "abcdefg", key901 = "abcdefg", key902 = "abcdefg", key903 = "abcdefg", key904 = "abcdefg", key905 = "abcdefg", key906 = "abcdefg", key907 = "abcdefg", key908 = "abcdefg", key909 = "abcdefg", key910 = "abcdefg", key911 = "abcdefg", key912 = "abcdefg", key913 = "abcdefg", key914 = "abcdefg", key915 = "abcdefg", key916 = "abcdefg", key917 = "abcdefg", key918 = "abcdefg", key919 = "abcdefg", key920 = "abcdefg", key921 = "abcdefg", key922 = "abcdefg", key923 = "abcdefg", key924 = "abcdefg", key925 = "abcdefg", key926 = "abcdefg", key927 = "abcdefg", key928 = "abcdefg", key929 = "abcdefg", key930 = "abcdefg", key931 = "abcdefg", key932 = "abcdefg", key933 = "abcdefg", key934 = "abcdefg", key935 = "abcdefg", key936 = "abcdefg", key937 = "abcdefg", key938 = "abcdefg", key939 = "abcdefg", key940 = "abcdefg", key941 = "abcdefg", key942 = "abcdefg", key943 = "abcdefg", key944 = "abcdefg", key945 = "abcdefg", key946 = "abcdefg", key947 = "abcdefg", key948 = "abcdefg", key949 = "abcdefg", key950 = "abcdefg", key951 = "abcdefg", key952 = "abcdefg", key953 = "abcdefg", key954 = "abcdefg", key955 = "abcdefg", key956 = "abcdefg", key957 = "abcdefg", key958 = "abcdefg", key959 = "abcdefg", key960 = "abcdefg", key961 = "abcdefg", key962 = "abcdefg", key963 = "abcdefg", key964 = "abcdefg", key965 = "abcdefg", key966 = "abcdefg", key967 = "abcdefg", key968 = "abcdefg", key969 = "abcdefg", key970 = "abcdefg", key971 = "abcdefg", key972 = "abcdefg", key973 = "abcdefg", key974 = "abcdefg", key975 = "abcdefg", key976 = "abcdefg", key977 = "abcdefg", key978 = "abcdefg", key979 = "abcdefg", key980 = "abcdefg", key981 = "abcdefg", key982 = "abcdefg", key983 = "abcdefg", key984 = "abcdefg", key985 = "abcdefg", key986 = "abcdefg", key987 = "abcdefg", key988 = "abcdefg", key989 = "abcdefg", key990 = "abcdefg", key991 = "abcdefg", key992 = "abcdefg", key993 = "abcdefg", key994 = "abcdefg", key995 = "abcdefg", key996 = "abcdefg", key997 = "abcdefg", key998 = "abcdefg", key999 = "abcdefg", key1000 = "abcdefg", end = true}
diff --git a/tests/data/valid/toml-lang-compliance/valid/qa/qa-table-inline-nested-1000.toml b/tests/data/valid/toml-lang-compliance/valid/qa/qa-table-inline-nested-1000.toml
new file mode 100644
index 0000000..5cc4bfe
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/qa/qa-table-inline-nested-1000.toml
@@ -0,0 +1 @@
+key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {key = {}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}} }
diff --git a/tests/data/valid/toml-lang-compliance/valid/spec-readme-example.json b/tests/data/valid/toml-lang-compliance/valid/spec-readme-example.json
new file mode 100644
index 0000000..8be2269
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/spec-readme-example.json
@@ -0,0 +1,43 @@
+{"title":
+ {"type":"string","value":"TOML Example"},
+ "owner":
+ {"name":
+ {"type":"string","value":"Tom Preston-Werner"},
+ "dob":
+ {"type":"offset datetime","value":"1979-05-27T07:32:00-08:00"}},
+ "database":
+ {"server":
+ {"type":"string","value":"192.168.1.1"},
+ "ports":
+ {"type":"array","value":[
+ {"type":"integer","value":"8001"},
+ {"type":"integer","value":"8001"},
+ {"type":"integer","value":"8002"}]},
+ "connection_max":
+ {"type":"integer","value":"5000"},
+ "enabled":
+ {"type":"boolean","value":"true"}},
+ "servers":
+ {"alpha":
+ {"ip":
+ {"type":"string","value":"10.0.0.1"},
+ "dc":
+ {"type":"string","value":"eqdc10"}},
+ "beta":
+ {"ip":
+ {"type":"string","value":"10.0.0.2"},
+ "dc":
+ {"type":"string","value":"eqdc10"}}},
+ "clients":
+ {"data":
+ {"type":"array","value":[
+ {"type":"array","value":[
+ {"type":"string","value":"gamma"},
+ {"type":"string","value":"delta"}]},
+ {"type":"array","value":[
+ {"type":"integer","value":"1"},
+ {"type":"integer","value":"2"}]}]},
+ "hosts":
+ {"type":"array","value":[
+ {"type":"string","value":"alpha"},
+ {"type":"string","value":"omega"}]}}}
diff --git a/tests/data/valid/toml-lang-compliance/valid/spec-readme-example.toml b/tests/data/valid/toml-lang-compliance/valid/spec-readme-example.toml
new file mode 100644
index 0000000..21895a2
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/spec-readme-example.toml
@@ -0,0 +1,33 @@
+# This is a TOML document.
+
+title = "TOML Example"
+
+[owner]
+name = "Tom Preston-Werner"
+dob = 1979-05-27T07:32:00-08:00 # First class dates
+
+[database]
+server = "192.168.1.1"
+ports = [ 8001, 8001, 8002 ]
+connection_max = 5000
+enabled = true
+
+[servers]
+
+ # Indentation (tabs and/or spaces) is allowed but not required
+ [servers.alpha]
+ ip = "10.0.0.1"
+ dc = "eqdc10"
+
+ [servers.beta]
+ ip = "10.0.0.2"
+ dc = "eqdc10"
+
+[clients]
+data = [ ["gamma", "delta"], [1, 2] ]
+
+# Line breaks are OK when inside arrays
+hosts = [
+ "alpha",
+ "omega"
+]
diff --git a/tests/data/valid/toml-lang-compliance/valid/string/spec-string-basic-multiline-1.json b/tests/data/valid/toml-lang-compliance/valid/string/spec-string-basic-multiline-1.json
new file mode 100644
index 0000000..23a7ea8
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/string/spec-string-basic-multiline-1.json
@@ -0,0 +1,2 @@
+{"str1":
+ {"type":"string","value":"Roses are red\nViolets are blue"}}
diff --git a/tests/data/valid/toml-lang-compliance/valid/string/spec-string-basic-multiline-1.toml b/tests/data/valid/toml-lang-compliance/valid/string/spec-string-basic-multiline-1.toml
new file mode 100644
index 0000000..337ad08
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/string/spec-string-basic-multiline-1.toml
@@ -0,0 +1,3 @@
+str1 = """
+Roses are red
+Violets are blue"""
diff --git a/tests/data/valid/toml-lang-compliance/valid/string/spec-string-basic-multiline-2.json b/tests/data/valid/toml-lang-compliance/valid/string/spec-string-basic-multiline-2.json
new file mode 100644
index 0000000..5210339
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/string/spec-string-basic-multiline-2.json
@@ -0,0 +1,2 @@
+{"str":
+ {"type":"string","value":"The quick brown fox jumps over the lazy dog."}}
diff --git a/tests/data/valid/toml-lang-compliance/valid/string/spec-string-basic-multiline-2.toml b/tests/data/valid/toml-lang-compliance/valid/string/spec-string-basic-multiline-2.toml
new file mode 100644
index 0000000..19c3210
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/string/spec-string-basic-multiline-2.toml
@@ -0,0 +1,6 @@
+str = """
+The quick brown \
+
+
+ fox jumps over \
+ the lazy dog."""
diff --git a/tests/data/valid/toml-lang-compliance/valid/string/spec-string-basic-multiline-3.json b/tests/data/valid/toml-lang-compliance/valid/string/spec-string-basic-multiline-3.json
new file mode 100644
index 0000000..5210339
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/string/spec-string-basic-multiline-3.json
@@ -0,0 +1,2 @@
+{"str":
+ {"type":"string","value":"The quick brown fox jumps over the lazy dog."}}
diff --git a/tests/data/valid/toml-lang-compliance/valid/string/spec-string-basic-multiline-3.toml b/tests/data/valid/toml-lang-compliance/valid/string/spec-string-basic-multiline-3.toml
new file mode 100644
index 0000000..dcbdc14
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/string/spec-string-basic-multiline-3.toml
@@ -0,0 +1,5 @@
+str = """\
+ The quick brown \
+ fox jumps over \
+ the lazy dog.\
+ """
diff --git a/tests/data/valid/toml-lang-compliance/valid/string/spec-string-basic-multiline-4.json b/tests/data/valid/toml-lang-compliance/valid/string/spec-string-basic-multiline-4.json
new file mode 100644
index 0000000..4b379dd
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/string/spec-string-basic-multiline-4.json
@@ -0,0 +1,2 @@
+{"a":
+ {"type":"string","value":"abcdef"}}
diff --git a/tests/data/valid/toml-lang-compliance/valid/string/spec-string-basic-multiline-4.toml b/tests/data/valid/toml-lang-compliance/valid/string/spec-string-basic-multiline-4.toml
new file mode 100644
index 0000000..03ceb5a
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/string/spec-string-basic-multiline-4.toml
@@ -0,0 +1,2 @@
+a = """abc\
+def"""
diff --git a/tests/data/valid/toml-lang-compliance/valid/string/spec-string-basic-multiline-5.json b/tests/data/valid/toml-lang-compliance/valid/string/spec-string-basic-multiline-5.json
new file mode 100644
index 0000000..517ae32
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/string/spec-string-basic-multiline-5.json
@@ -0,0 +1,2 @@
+{"ml-escaped-nl":
+ {"type":"string","value":" foo bar \\\n baz \\quux"}}
diff --git a/tests/data/valid/toml-lang-compliance/valid/string/spec-string-basic-multiline-5.toml b/tests/data/valid/toml-lang-compliance/valid/string/spec-string-basic-multiline-5.toml
new file mode 100644
index 0000000..845df2e
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/string/spec-string-basic-multiline-5.toml
@@ -0,0 +1,5 @@
+ml-escaped-nl = """
+ foo \
+ bar \\
+ baz \\\
+ quux"""
diff --git a/tests/data/valid/toml-lang-compliance/valid/string/spec-string-basic-multiline-6.json b/tests/data/valid/toml-lang-compliance/valid/string/spec-string-basic-multiline-6.json
new file mode 100644
index 0000000..8d7b1cb
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/string/spec-string-basic-multiline-6.json
@@ -0,0 +1,2 @@
+{"str4":
+ {"type":"string","value":"Here are two quotation marks: \"\". Simple enough."}}
diff --git a/tests/data/valid/toml-lang-compliance/valid/string/spec-string-basic-multiline-6.toml b/tests/data/valid/toml-lang-compliance/valid/string/spec-string-basic-multiline-6.toml
new file mode 100644
index 0000000..2552392
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/string/spec-string-basic-multiline-6.toml
@@ -0,0 +1 @@
+str4 = """Here are two quotation marks: "". Simple enough."""
diff --git a/tests/data/valid/toml-lang-compliance/valid/string/spec-string-basic-multiline-7.json b/tests/data/valid/toml-lang-compliance/valid/string/spec-string-basic-multiline-7.json
new file mode 100644
index 0000000..874b5e3
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/string/spec-string-basic-multiline-7.json
@@ -0,0 +1,2 @@
+{"str5":
+ {"type":"string","value":"Here are three quotation marks: \"\"\"."}}
diff --git a/tests/data/valid/toml-lang-compliance/valid/string/spec-string-basic-multiline-7.toml b/tests/data/valid/toml-lang-compliance/valid/string/spec-string-basic-multiline-7.toml
new file mode 100644
index 0000000..4aa57e6
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/string/spec-string-basic-multiline-7.toml
@@ -0,0 +1 @@
+str5 = """Here are three quotation marks: ""\"."""
diff --git a/tests/data/valid/toml-lang-compliance/valid/string/spec-string-basic-multiline-8.json b/tests/data/valid/toml-lang-compliance/valid/string/spec-string-basic-multiline-8.json
new file mode 100644
index 0000000..83fbe97
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/string/spec-string-basic-multiline-8.json
@@ -0,0 +1,2 @@
+{"str6":
+ {"type":"string","value":"Here are fifteen quotation marks: \"\"\"\"\"\"\"\"\"\"\"\"\"\"\"."}}
diff --git a/tests/data/valid/toml-lang-compliance/valid/string/spec-string-basic-multiline-8.toml b/tests/data/valid/toml-lang-compliance/valid/string/spec-string-basic-multiline-8.toml
new file mode 100644
index 0000000..808119f
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/string/spec-string-basic-multiline-8.toml
@@ -0,0 +1 @@
+str6 = """Here are fifteen quotation marks: ""\"""\"""\"""\"""\"."""
diff --git a/tests/data/valid/toml-lang-compliance/valid/string/spec-string-basic-multiline-9.json b/tests/data/valid/toml-lang-compliance/valid/string/spec-string-basic-multiline-9.json
new file mode 100644
index 0000000..c235ac9
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/string/spec-string-basic-multiline-9.json
@@ -0,0 +1,2 @@
+{"str7":
+ {"type":"string","value":"\"This,\" she said, \"is just a pointless statement.\""}}
diff --git a/tests/data/valid/toml-lang-compliance/valid/string/spec-string-basic-multiline-9.toml b/tests/data/valid/toml-lang-compliance/valid/string/spec-string-basic-multiline-9.toml
new file mode 100644
index 0000000..693b410
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/string/spec-string-basic-multiline-9.toml
@@ -0,0 +1 @@
+str7 = """"This," she said, "is just a pointless statement.""""
diff --git a/tests/data/valid/toml-lang-compliance/valid/string/spec-string-basic-tab-multiline.json b/tests/data/valid/toml-lang-compliance/valid/string/spec-string-basic-tab-multiline.json
new file mode 100644
index 0000000..3939685
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/string/spec-string-basic-tab-multiline.json
@@ -0,0 +1,2 @@
+{"str":
+ {"type":"string","value":"This is a\ttab"}}
diff --git a/tests/data/valid/toml-lang-compliance/valid/string/spec-string-basic-tab-multiline.toml b/tests/data/valid/toml-lang-compliance/valid/string/spec-string-basic-tab-multiline.toml
new file mode 100644
index 0000000..3a21209
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/string/spec-string-basic-tab-multiline.toml
@@ -0,0 +1 @@
+str = """This is a tab"""
diff --git a/tests/data/valid/toml-lang-compliance/valid/string/spec-string-basic-tab.json b/tests/data/valid/toml-lang-compliance/valid/string/spec-string-basic-tab.json
new file mode 100644
index 0000000..3939685
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/string/spec-string-basic-tab.json
@@ -0,0 +1,2 @@
+{"str":
+ {"type":"string","value":"This is a\ttab"}}
diff --git a/tests/data/valid/toml-lang-compliance/valid/string/spec-string-basic-tab.toml b/tests/data/valid/toml-lang-compliance/valid/string/spec-string-basic-tab.toml
new file mode 100644
index 0000000..4aa0752
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/string/spec-string-basic-tab.toml
@@ -0,0 +1 @@
+str = "This is a tab"
diff --git a/tests/data/valid/toml-lang-compliance/valid/string/spec-string-basic.json b/tests/data/valid/toml-lang-compliance/valid/string/spec-string-basic.json
new file mode 100644
index 0000000..fa8b053
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/string/spec-string-basic.json
@@ -0,0 +1,2 @@
+{"str":
+ {"type":"string","value":"I'm a string. \"You can quote me\". Name\tJos\u00E9\nLocation\tSF."}}
diff --git a/tests/data/valid/toml-lang-compliance/valid/string/spec-string-basic.toml b/tests/data/valid/toml-lang-compliance/valid/string/spec-string-basic.toml
new file mode 100644
index 0000000..b611549
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/string/spec-string-basic.toml
@@ -0,0 +1 @@
+str = "I'm a string. \"You can quote me\". Name\tJos\u00E9\nLocation\tSF."
diff --git a/tests/data/valid/toml-lang-compliance/valid/string/spec-string-escape-1.json b/tests/data/valid/toml-lang-compliance/valid/string/spec-string-escape-1.json
new file mode 100644
index 0000000..a1637a6
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/string/spec-string-escape-1.json
@@ -0,0 +1,2 @@
+{"a":
+ {"type":"string","value":"\b"}}
diff --git a/tests/data/valid/toml-lang-compliance/valid/string/spec-string-escape-1.toml b/tests/data/valid/toml-lang-compliance/valid/string/spec-string-escape-1.toml
new file mode 100644
index 0000000..f0398c4
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/string/spec-string-escape-1.toml
@@ -0,0 +1 @@
+a = "\b"
diff --git a/tests/data/valid/toml-lang-compliance/valid/string/spec-string-escape-2.json b/tests/data/valid/toml-lang-compliance/valid/string/spec-string-escape-2.json
new file mode 100644
index 0000000..e801115
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/string/spec-string-escape-2.json
@@ -0,0 +1,2 @@
+{"a":
+ {"type":"string","value":"\t"}}
diff --git a/tests/data/valid/toml-lang-compliance/valid/string/spec-string-escape-2.toml b/tests/data/valid/toml-lang-compliance/valid/string/spec-string-escape-2.toml
new file mode 100644
index 0000000..1738783
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/string/spec-string-escape-2.toml
@@ -0,0 +1 @@
+a = "\t"
diff --git a/tests/data/valid/toml-lang-compliance/valid/string/spec-string-escape-3.json b/tests/data/valid/toml-lang-compliance/valid/string/spec-string-escape-3.json
new file mode 100644
index 0000000..eeb808d
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/string/spec-string-escape-3.json
@@ -0,0 +1,2 @@
+{"a":
+ {"type":"string","value":"\n"}}
diff --git a/tests/data/valid/toml-lang-compliance/valid/string/spec-string-escape-3.toml b/tests/data/valid/toml-lang-compliance/valid/string/spec-string-escape-3.toml
new file mode 100644
index 0000000..6e3e62c
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/string/spec-string-escape-3.toml
@@ -0,0 +1 @@
+a = "\n"
diff --git a/tests/data/valid/toml-lang-compliance/valid/string/spec-string-escape-4.json b/tests/data/valid/toml-lang-compliance/valid/string/spec-string-escape-4.json
new file mode 100644
index 0000000..6f54fda
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/string/spec-string-escape-4.json
@@ -0,0 +1,2 @@
+{"a":
+ {"type":"string","value":"\f"}}
diff --git a/tests/data/valid/toml-lang-compliance/valid/string/spec-string-escape-4.toml b/tests/data/valid/toml-lang-compliance/valid/string/spec-string-escape-4.toml
new file mode 100644
index 0000000..4588c90
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/string/spec-string-escape-4.toml
@@ -0,0 +1 @@
+a = "\f"
diff --git a/tests/data/valid/toml-lang-compliance/valid/string/spec-string-escape-5.json b/tests/data/valid/toml-lang-compliance/valid/string/spec-string-escape-5.json
new file mode 100644
index 0000000..b7adfbc
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/string/spec-string-escape-5.json
@@ -0,0 +1,2 @@
+{"a":
+ {"type":"string","value":"\r"}}
diff --git a/tests/data/valid/toml-lang-compliance/valid/string/spec-string-escape-5.toml b/tests/data/valid/toml-lang-compliance/valid/string/spec-string-escape-5.toml
new file mode 100644
index 0000000..656628a
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/string/spec-string-escape-5.toml
@@ -0,0 +1 @@
+a = "\r"
diff --git a/tests/data/valid/toml-lang-compliance/valid/string/spec-string-escape-6.json b/tests/data/valid/toml-lang-compliance/valid/string/spec-string-escape-6.json
new file mode 100644
index 0000000..ac765b3
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/string/spec-string-escape-6.json
@@ -0,0 +1,2 @@
+{"a":
+ {"type":"string","value":"\""}}
diff --git a/tests/data/valid/toml-lang-compliance/valid/string/spec-string-escape-6.toml b/tests/data/valid/toml-lang-compliance/valid/string/spec-string-escape-6.toml
new file mode 100644
index 0000000..6b10d70
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/string/spec-string-escape-6.toml
@@ -0,0 +1 @@
+a = "\""
diff --git a/tests/data/valid/toml-lang-compliance/valid/string/spec-string-escape-7.json b/tests/data/valid/toml-lang-compliance/valid/string/spec-string-escape-7.json
new file mode 100644
index 0000000..8ad2a80
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/string/spec-string-escape-7.json
@@ -0,0 +1,2 @@
+{"a":
+ {"type":"string","value":"\\"}}
diff --git a/tests/data/valid/toml-lang-compliance/valid/string/spec-string-escape-7.toml b/tests/data/valid/toml-lang-compliance/valid/string/spec-string-escape-7.toml
new file mode 100644
index 0000000..45822af
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/string/spec-string-escape-7.toml
@@ -0,0 +1 @@
+a = "\\"
diff --git a/tests/data/valid/toml-lang-compliance/valid/string/spec-string-escape-8.json b/tests/data/valid/toml-lang-compliance/valid/string/spec-string-escape-8.json
new file mode 100644
index 0000000..763f1fb
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/string/spec-string-escape-8.json
@@ -0,0 +1,2 @@
+{"a":
+ {"type":"string","value":"\u0000"}}
diff --git a/tests/data/valid/toml-lang-compliance/valid/string/spec-string-escape-8.toml b/tests/data/valid/toml-lang-compliance/valid/string/spec-string-escape-8.toml
new file mode 100644
index 0000000..098e7df
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/string/spec-string-escape-8.toml
@@ -0,0 +1 @@
+a = "\u0000"
diff --git a/tests/data/valid/toml-lang-compliance/valid/string/spec-string-escape-9.json b/tests/data/valid/toml-lang-compliance/valid/string/spec-string-escape-9.json
new file mode 100644
index 0000000..763f1fb
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/string/spec-string-escape-9.json
@@ -0,0 +1,2 @@
+{"a":
+ {"type":"string","value":"\u0000"}}
diff --git a/tests/data/valid/toml-lang-compliance/valid/string/spec-string-escape-9.toml b/tests/data/valid/toml-lang-compliance/valid/string/spec-string-escape-9.toml
new file mode 100644
index 0000000..f9d3db5
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/string/spec-string-escape-9.toml
@@ -0,0 +1 @@
+a = "\U00000000"
diff --git a/tests/data/valid/toml-lang-compliance/valid/string/spec-string-literal-1.json b/tests/data/valid/toml-lang-compliance/valid/string/spec-string-literal-1.json
new file mode 100644
index 0000000..feb2105
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/string/spec-string-literal-1.json
@@ -0,0 +1,2 @@
+{"winpath":
+ {"type":"string","value":"C:\\Users\\nodejs\\templates"}}
diff --git a/tests/data/valid/toml-lang-compliance/valid/string/spec-string-literal-1.toml b/tests/data/valid/toml-lang-compliance/valid/string/spec-string-literal-1.toml
new file mode 100644
index 0000000..6f2304c
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/string/spec-string-literal-1.toml
@@ -0,0 +1 @@
+winpath = 'C:\Users\nodejs\templates'
diff --git a/tests/data/valid/toml-lang-compliance/valid/string/spec-string-literal-2.json b/tests/data/valid/toml-lang-compliance/valid/string/spec-string-literal-2.json
new file mode 100644
index 0000000..0f4abca
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/string/spec-string-literal-2.json
@@ -0,0 +1,2 @@
+{"winpath2":
+ {"type":"string","value":"\\\\ServerX\\admin$\\system32\\"}}
diff --git a/tests/data/valid/toml-lang-compliance/valid/string/spec-string-literal-2.toml b/tests/data/valid/toml-lang-compliance/valid/string/spec-string-literal-2.toml
new file mode 100644
index 0000000..21ab5f8
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/string/spec-string-literal-2.toml
@@ -0,0 +1 @@
+winpath2 = '\\ServerX\admin$\system32\'
diff --git a/tests/data/valid/toml-lang-compliance/valid/string/spec-string-literal-3.json b/tests/data/valid/toml-lang-compliance/valid/string/spec-string-literal-3.json
new file mode 100644
index 0000000..74f8673
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/string/spec-string-literal-3.json
@@ -0,0 +1,2 @@
+{"quoted":
+ {"type":"string","value":"Tom \"Dubs\" Preston-Werner"}}
diff --git a/tests/data/valid/toml-lang-compliance/valid/string/spec-string-literal-3.toml b/tests/data/valid/toml-lang-compliance/valid/string/spec-string-literal-3.toml
new file mode 100644
index 0000000..1ccdd68
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/string/spec-string-literal-3.toml
@@ -0,0 +1 @@
+quoted = 'Tom "Dubs" Preston-Werner'
diff --git a/tests/data/valid/toml-lang-compliance/valid/string/spec-string-literal-4.json b/tests/data/valid/toml-lang-compliance/valid/string/spec-string-literal-4.json
new file mode 100644
index 0000000..dade858
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/string/spec-string-literal-4.json
@@ -0,0 +1,2 @@
+{"regex":
+ {"type":"string","value":"<\\i\\c*\\s*>"}}
diff --git a/tests/data/valid/toml-lang-compliance/valid/string/spec-string-literal-4.toml b/tests/data/valid/toml-lang-compliance/valid/string/spec-string-literal-4.toml
new file mode 100644
index 0000000..baf2bd0
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/string/spec-string-literal-4.toml
@@ -0,0 +1 @@
+regex = '<\i\c*\s*>'
diff --git a/tests/data/valid/toml-lang-compliance/valid/string/spec-string-literal-multiline-1.json b/tests/data/valid/toml-lang-compliance/valid/string/spec-string-literal-multiline-1.json
new file mode 100644
index 0000000..d98c25c
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/string/spec-string-literal-multiline-1.json
@@ -0,0 +1,2 @@
+{"regex2":
+ {"type":"string","value":"I [dw]on't need \\d{2} apples"}}
diff --git a/tests/data/valid/toml-lang-compliance/valid/string/spec-string-literal-multiline-1.toml b/tests/data/valid/toml-lang-compliance/valid/string/spec-string-literal-multiline-1.toml
new file mode 100644
index 0000000..5d6cc0e
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/string/spec-string-literal-multiline-1.toml
@@ -0,0 +1 @@
+regex2 = '''I [dw]on't need \d{2} apples'''
diff --git a/tests/data/valid/toml-lang-compliance/valid/string/spec-string-literal-multiline-2.json b/tests/data/valid/toml-lang-compliance/valid/string/spec-string-literal-multiline-2.json
new file mode 100644
index 0000000..04d2dff
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/string/spec-string-literal-multiline-2.json
@@ -0,0 +1,2 @@
+{"lines":
+ {"type":"string","value":"The first newline is\ntrimmed in raw strings.\n All other whitespace\n is preserved.\n"}}
diff --git a/tests/data/valid/toml-lang-compliance/valid/string/spec-string-literal-multiline-2.toml b/tests/data/valid/toml-lang-compliance/valid/string/spec-string-literal-multiline-2.toml
new file mode 100644
index 0000000..0af7025
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/string/spec-string-literal-multiline-2.toml
@@ -0,0 +1,6 @@
+lines = '''
+The first newline is
+trimmed in raw strings.
+ All other whitespace
+ is preserved.
+'''
diff --git a/tests/data/valid/toml-lang-compliance/valid/string/spec-string-literal-multiline-3.json b/tests/data/valid/toml-lang-compliance/valid/string/spec-string-literal-multiline-3.json
new file mode 100644
index 0000000..bb5dd94
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/string/spec-string-literal-multiline-3.json
@@ -0,0 +1,2 @@
+{"quot15":
+ {"type":"string","value":"Here are fifteen quotation marks: \"\"\"\"\"\"\"\"\"\"\"\"\"\"\""}}
diff --git a/tests/data/valid/toml-lang-compliance/valid/string/spec-string-literal-multiline-3.toml b/tests/data/valid/toml-lang-compliance/valid/string/spec-string-literal-multiline-3.toml
new file mode 100644
index 0000000..54f6470
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/string/spec-string-literal-multiline-3.toml
@@ -0,0 +1 @@
+quot15 = '''Here are fifteen quotation marks: """""""""""""""'''
diff --git a/tests/data/valid/toml-lang-compliance/valid/string/spec-string-literal-multiline-4.json b/tests/data/valid/toml-lang-compliance/valid/string/spec-string-literal-multiline-4.json
new file mode 100644
index 0000000..19a047d
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/string/spec-string-literal-multiline-4.json
@@ -0,0 +1,2 @@
+{"str":
+ {"type":"string","value":"'That,' she said, 'is still pointless.'"}}
diff --git a/tests/data/valid/toml-lang-compliance/valid/string/spec-string-literal-multiline-4.toml b/tests/data/valid/toml-lang-compliance/valid/string/spec-string-literal-multiline-4.toml
new file mode 100644
index 0000000..d568f48
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/string/spec-string-literal-multiline-4.toml
@@ -0,0 +1 @@
+str = ''''That,' she said, 'is still pointless.''''
diff --git a/tests/data/valid/toml-lang-compliance/valid/table/spec-extend-dotted-object-1.json b/tests/data/valid/toml-lang-compliance/valid/table/spec-extend-dotted-object-1.json
new file mode 100644
index 0000000..408e54d
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/table/spec-extend-dotted-object-1.json
@@ -0,0 +1,6 @@
+{"fruit":
+ {"apple":
+ {"smooth":
+ {"type":"boolean","value":"true"}},
+ "orange":
+ {"type":"integer","value":"2"}}}
diff --git a/tests/data/valid/toml-lang-compliance/valid/table/spec-extend-dotted-object-1.toml b/tests/data/valid/toml-lang-compliance/valid/table/spec-extend-dotted-object-1.toml
new file mode 100644
index 0000000..b4d1b37
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/table/spec-extend-dotted-object-1.toml
@@ -0,0 +1,5 @@
+# This makes the key "fruit" into a table.
+fruit.apple.smooth = true
+
+# So then you can add to the table "fruit" like so:
+fruit.orange = 2
diff --git a/tests/data/valid/toml-lang-compliance/valid/table/spec-extend-dotted-object-2.json b/tests/data/valid/toml-lang-compliance/valid/table/spec-extend-dotted-object-2.json
new file mode 100644
index 0000000..6b68f35
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/table/spec-extend-dotted-object-2.json
@@ -0,0 +1,14 @@
+{"apple":
+ {"type":
+ {"type":"string","value":"fruit"},
+ "skin":
+ {"type":"string","value":"thin"},
+ "color":
+ {"type":"string","value":"red"}},
+ "orange":
+ {"type":
+ {"type":"string","value":"fruit"},
+ "skin":
+ {"type":"string","value":"thick"},
+ "color":
+ {"type":"string","value":"orange"}}}
diff --git a/tests/data/valid/toml-lang-compliance/valid/table/spec-extend-dotted-object-2.toml b/tests/data/valid/toml-lang-compliance/valid/table/spec-extend-dotted-object-2.toml
new file mode 100644
index 0000000..dc94a8c
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/table/spec-extend-dotted-object-2.toml
@@ -0,0 +1,10 @@
+# VALID BUT DISCOURAGED
+
+apple.type = "fruit"
+orange.type = "fruit"
+
+apple.skin = "thin"
+orange.skin = "thick"
+
+apple.color = "red"
+orange.color = "orange"
diff --git a/tests/data/valid/toml-lang-compliance/valid/table/spec-extend-dotted-object-3.json b/tests/data/valid/toml-lang-compliance/valid/table/spec-extend-dotted-object-3.json
new file mode 100644
index 0000000..6b68f35
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/table/spec-extend-dotted-object-3.json
@@ -0,0 +1,14 @@
+{"apple":
+ {"type":
+ {"type":"string","value":"fruit"},
+ "skin":
+ {"type":"string","value":"thin"},
+ "color":
+ {"type":"string","value":"red"}},
+ "orange":
+ {"type":
+ {"type":"string","value":"fruit"},
+ "skin":
+ {"type":"string","value":"thick"},
+ "color":
+ {"type":"string","value":"orange"}}}
diff --git a/tests/data/valid/toml-lang-compliance/valid/table/spec-extend-dotted-object-3.toml b/tests/data/valid/toml-lang-compliance/valid/table/spec-extend-dotted-object-3.toml
new file mode 100644
index 0000000..705686c
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/table/spec-extend-dotted-object-3.toml
@@ -0,0 +1,9 @@
+# RECOMMENDED
+
+apple.type = "fruit"
+apple.skin = "thin"
+apple.color = "red"
+
+orange.type = "fruit"
+orange.skin = "thick"
+orange.color = "orange"
diff --git a/tests/data/valid/toml-lang-compliance/valid/table/spec-table-1.json b/tests/data/valid/toml-lang-compliance/valid/table/spec-table-1.json
new file mode 100644
index 0000000..d9fd71f
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/table/spec-table-1.json
@@ -0,0 +1,10 @@
+{"table-1":
+ {"key1":
+ {"type":"string","value":"some string"},
+ "key2":
+ {"type":"integer","value":"123"}},
+ "table-2":
+ {"key1":
+ {"type":"string","value":"another string"},
+ "key2":
+ {"type":"integer","value":"456"}}}
diff --git a/tests/data/valid/toml-lang-compliance/valid/table/spec-table-1.toml b/tests/data/valid/toml-lang-compliance/valid/table/spec-table-1.toml
new file mode 100644
index 0000000..6b4884c
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/table/spec-table-1.toml
@@ -0,0 +1,7 @@
+[table-1]
+key1 = "some string"
+key2 = 123
+
+[table-2]
+key1 = "another string"
+key2 = 456
diff --git a/tests/data/valid/toml-lang-compliance/valid/table/spec-table-2.json b/tests/data/valid/toml-lang-compliance/valid/table/spec-table-2.json
new file mode 100644
index 0000000..5a51158
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/table/spec-table-2.json
@@ -0,0 +1,5 @@
+{"dog":
+ {"tater.man":
+ {"type":
+ {"name":
+ {"type":"string","value":"pug"}}}}}
diff --git a/tests/data/valid/toml-lang-compliance/valid/table/spec-table-2.toml b/tests/data/valid/toml-lang-compliance/valid/table/spec-table-2.toml
new file mode 100644
index 0000000..32cbe79
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/table/spec-table-2.toml
@@ -0,0 +1,2 @@
+[dog."tater.man"]
+type.name = "pug"
diff --git a/tests/data/valid/toml-lang-compliance/valid/table/spec-table-3.json b/tests/data/valid/toml-lang-compliance/valid/table/spec-table-3.json
new file mode 100644
index 0000000..7c6c06b
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/table/spec-table-3.json
@@ -0,0 +1,4 @@
+{"a":
+ {"b":
+ {"c":
+ {}}}}
diff --git a/tests/data/valid/toml-lang-compliance/valid/table/spec-table-3.toml b/tests/data/valid/toml-lang-compliance/valid/table/spec-table-3.toml
new file mode 100644
index 0000000..b7987d6
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/table/spec-table-3.toml
@@ -0,0 +1 @@
+[a.b.c]
diff --git a/tests/data/valid/toml-lang-compliance/valid/table/spec-table-4.json b/tests/data/valid/toml-lang-compliance/valid/table/spec-table-4.json
new file mode 100644
index 0000000..ff55bd1
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/table/spec-table-4.json
@@ -0,0 +1,4 @@
+{"d":
+ {"e":
+ {"f":
+ {}}}}
diff --git a/tests/data/valid/toml-lang-compliance/valid/table/spec-table-4.toml b/tests/data/valid/toml-lang-compliance/valid/table/spec-table-4.toml
new file mode 100644
index 0000000..e2f7fd4
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/table/spec-table-4.toml
@@ -0,0 +1 @@
+[ d.e.f ] # same as [d.e.f]
diff --git a/tests/data/valid/toml-lang-compliance/valid/table/spec-table-5.json b/tests/data/valid/toml-lang-compliance/valid/table/spec-table-5.json
new file mode 100644
index 0000000..9508939
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/table/spec-table-5.json
@@ -0,0 +1,4 @@
+{"g":
+ {"h":
+ {"i":
+ {}}}}
diff --git a/tests/data/valid/toml-lang-compliance/valid/table/spec-table-5.toml b/tests/data/valid/toml-lang-compliance/valid/table/spec-table-5.toml
new file mode 100644
index 0000000..c4175b3
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/table/spec-table-5.toml
@@ -0,0 +1 @@
+[ g . h . i ] # same as [g.h.i]
diff --git a/tests/data/valid/toml-lang-compliance/valid/table/spec-table-6.json b/tests/data/valid/toml-lang-compliance/valid/table/spec-table-6.json
new file mode 100644
index 0000000..10d48ab
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/table/spec-table-6.json
@@ -0,0 +1,4 @@
+{"j":
+ {"ʞ":
+ {"l":
+ {}}}}
diff --git a/tests/data/valid/toml-lang-compliance/valid/table/spec-table-6.toml b/tests/data/valid/toml-lang-compliance/valid/table/spec-table-6.toml
new file mode 100644
index 0000000..e2fb886
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/table/spec-table-6.toml
@@ -0,0 +1 @@
+[ j . "ʞ" . 'l' ] # same as [j."ʞ".'l']
diff --git a/tests/data/valid/toml-lang-compliance/valid/table/spec-table-7.json b/tests/data/valid/toml-lang-compliance/valid/table/spec-table-7.json
new file mode 100644
index 0000000..e106387
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/table/spec-table-7.json
@@ -0,0 +1,5 @@
+{"x":
+ {"y":
+ {"z":
+ {"w":
+ {}}}}}
diff --git a/tests/data/valid/toml-lang-compliance/valid/table/spec-table-7.toml b/tests/data/valid/toml-lang-compliance/valid/table/spec-table-7.toml
new file mode 100644
index 0000000..73ed68b
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/table/spec-table-7.toml
@@ -0,0 +1,5 @@
+# [x] you
+# [x.y] don't
+# [x.y.z] need these
+[x.y.z.w] # for this to work
+[x] # defining a super-table afterwards is ok
diff --git a/tests/data/valid/toml-lang-compliance/valid/table/spec-table-8.json b/tests/data/valid/toml-lang-compliance/valid/table/spec-table-8.json
new file mode 100644
index 0000000..e2f0946
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/table/spec-table-8.json
@@ -0,0 +1,10 @@
+{"fruit":
+ {"apple":
+ {"color":
+ {"type":"string","value":"red"},
+ "taste":
+ {"sweet":
+ {"type":"boolean","value":"true"}},
+ "texture":
+ {"smooth":
+ {"type":"boolean","value":"true"}}}}}
diff --git a/tests/data/valid/toml-lang-compliance/valid/table/spec-table-8.toml b/tests/data/valid/toml-lang-compliance/valid/table/spec-table-8.toml
new file mode 100644
index 0000000..889b19e
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/table/spec-table-8.toml
@@ -0,0 +1,6 @@
+[fruit]
+apple.color = "red"
+apple.taste.sweet = true
+
+[fruit.apple.texture] # you can add sub-tables
+smooth = true
diff --git a/tests/data/valid/toml-lang-compliance/valid/table/spec-table-inline-1.json b/tests/data/valid/toml-lang-compliance/valid/table/spec-table-inline-1.json
new file mode 100644
index 0000000..6305585
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/table/spec-table-inline-1.json
@@ -0,0 +1,5 @@
+{"name":
+ {"first":
+ {"type":"string","value":"Tom"},
+ "last":
+ {"type":"string","value":"Preston-Werner"}}}
diff --git a/tests/data/valid/toml-lang-compliance/valid/table/spec-table-inline-1.toml b/tests/data/valid/toml-lang-compliance/valid/table/spec-table-inline-1.toml
new file mode 100644
index 0000000..4553198
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/table/spec-table-inline-1.toml
@@ -0,0 +1 @@
+name = { first = "Tom", last = "Preston-Werner" }
diff --git a/tests/data/valid/toml-lang-compliance/valid/table/spec-table-inline-2.json b/tests/data/valid/toml-lang-compliance/valid/table/spec-table-inline-2.json
new file mode 100644
index 0000000..63c6a38
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/table/spec-table-inline-2.json
@@ -0,0 +1,5 @@
+{"point":
+ {"x":
+ {"type":"integer","value":"1"},
+ "y":
+ {"type":"integer","value":"2"}}}
diff --git a/tests/data/valid/toml-lang-compliance/valid/table/spec-table-inline-2.toml b/tests/data/valid/toml-lang-compliance/valid/table/spec-table-inline-2.toml
new file mode 100644
index 0000000..2dfa897
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/table/spec-table-inline-2.toml
@@ -0,0 +1 @@
+point = { x = 1, y = 2 }
diff --git a/tests/data/valid/toml-lang-compliance/valid/table/spec-table-inline-3.json b/tests/data/valid/toml-lang-compliance/valid/table/spec-table-inline-3.json
new file mode 100644
index 0000000..9532553
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/table/spec-table-inline-3.json
@@ -0,0 +1,4 @@
+{"animal":
+ {"type":
+ {"name":
+ {"type":"string","value":"pug"}}}}
diff --git a/tests/data/valid/toml-lang-compliance/valid/table/spec-table-inline-3.toml b/tests/data/valid/toml-lang-compliance/valid/table/spec-table-inline-3.toml
new file mode 100644
index 0000000..d626011
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/table/spec-table-inline-3.toml
@@ -0,0 +1 @@
+animal = { type.name = "pug" }
diff --git a/tests/data/valid/toml-lang-compliance/valid/table/spec-table.json b/tests/data/valid/toml-lang-compliance/valid/table/spec-table.json
new file mode 100644
index 0000000..f16a5d7
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/table/spec-table.json
@@ -0,0 +1,2 @@
+{"table":
+ {}}
diff --git a/tests/data/valid/toml-lang-compliance/valid/table/spec-table.toml b/tests/data/valid/toml-lang-compliance/valid/table/spec-table.toml
new file mode 100644
index 0000000..f1098fd
--- /dev/null
+++ b/tests/data/valid/toml-lang-compliance/valid/table/spec-table.toml
@@ -0,0 +1 @@
+[table]
diff --git a/tests/data/valid/trailing-comma.json b/tests/data/valid/trailing-comma.json
new file mode 100644
index 0000000..dc6f166
--- /dev/null
+++ b/tests/data/valid/trailing-comma.json
@@ -0,0 +1,7 @@
+{"arr":
+ {"type":"array","value":
+ [
+ {"type":"integer","value":"1"}
+ ]
+ }
+}
diff --git a/tests/data/valid/trailing-comma.toml b/tests/data/valid/trailing-comma.toml
new file mode 100644
index 0000000..c5d5b9b
--- /dev/null
+++ b/tests/data/valid/trailing-comma.toml
@@ -0,0 +1 @@
+arr=[1,] \ No newline at end of file
diff --git a/tests/test_data.py b/tests/test_data.py
new file mode 100644
index 0000000..d73ff7c
--- /dev/null
+++ b/tests/test_data.py
@@ -0,0 +1,60 @@
+# SPDX-License-Identifier: MIT
+# SPDX-FileCopyrightText: 2021 Taneli Hukkinen
+# Licensed to PSF under a Contributor Agreement.
+
+import json
+from pathlib import Path
+import unittest
+
+from . import burntsushi, tomllib
+
+
+class MissingFile:
+ def __init__(self, path: Path):
+ self.path = path
+
+
+DATA_DIR = Path(__file__).parent / "data"
+
+VALID_FILES = tuple((DATA_DIR / "valid").glob("**/*.toml"))
+# VALID_FILES_EXPECTED = tuple(
+# json.loads(p.with_suffix(".json").read_bytes().decode()) for p in VALID_FILES
+# )
+_expected_files = []
+for p in VALID_FILES:
+ json_path = p.with_suffix(".json")
+ try:
+ text = json.loads(json_path.read_bytes().decode())
+ except FileNotFoundError:
+ text = MissingFile(json_path)
+ _expected_files.append(text)
+
+VALID_FILES_EXPECTED = tuple(_expected_files)
+INVALID_FILES = tuple((DATA_DIR / "invalid").glob("**/*.toml"))
+
+
+class TestData(unittest.TestCase):
+ def test_invalid(self):
+ for invalid in INVALID_FILES:
+ with self.subTest(msg=invalid.stem):
+ toml_bytes = invalid.read_bytes()
+ try:
+ toml_str = toml_bytes.decode()
+ except UnicodeDecodeError:
+ # Some BurntSushi tests are not valid UTF-8. Skip those.
+ continue
+ with self.assertRaises(tomllib.TOMLDecodeError):
+ tomllib.loads(toml_str)
+
+ def test_valid(self):
+ for valid, expected in zip(VALID_FILES, VALID_FILES_EXPECTED):
+ with self.subTest(msg=valid.stem):
+ if isinstance(expected, MissingFile):
+ # Would be nice to xfail here, but unittest doesn't seem
+ # to allow that in a nice way.
+ continue
+ toml_str = valid.read_bytes().decode()
+ actual = tomllib.loads(toml_str)
+ actual = burntsushi.convert(actual)
+ expected = burntsushi.normalize(expected)
+ self.assertEqual(actual, expected)
diff --git a/tests/test_error.py b/tests/test_error.py
new file mode 100644
index 0000000..7244626
--- /dev/null
+++ b/tests/test_error.py
@@ -0,0 +1,57 @@
+# SPDX-License-Identifier: MIT
+# SPDX-FileCopyrightText: 2021 Taneli Hukkinen
+# Licensed to PSF under a Contributor Agreement.
+
+import unittest
+
+from . import tomllib
+
+
+class TestError(unittest.TestCase):
+ def test_line_and_col(self):
+ with self.assertRaises(tomllib.TOMLDecodeError) as exc_info:
+ tomllib.loads("val=.")
+ self.assertEqual(str(exc_info.exception), "Invalid value (at line 1, column 5)")
+
+ with self.assertRaises(tomllib.TOMLDecodeError) as exc_info:
+ tomllib.loads(".")
+ self.assertEqual(
+ str(exc_info.exception), "Invalid statement (at line 1, column 1)"
+ )
+
+ with self.assertRaises(tomllib.TOMLDecodeError) as exc_info:
+ tomllib.loads("\n\nval=.")
+ self.assertEqual(str(exc_info.exception), "Invalid value (at line 3, column 5)")
+
+ with self.assertRaises(tomllib.TOMLDecodeError) as exc_info:
+ tomllib.loads("\n\n.")
+ self.assertEqual(
+ str(exc_info.exception), "Invalid statement (at line 3, column 1)"
+ )
+
+ def test_missing_value(self):
+ with self.assertRaises(tomllib.TOMLDecodeError) as exc_info:
+ tomllib.loads("\n\nfwfw=")
+ self.assertEqual(str(exc_info.exception), "Invalid value (at end of document)")
+
+ def test_invalid_char_quotes(self):
+ with self.assertRaises(tomllib.TOMLDecodeError) as exc_info:
+ tomllib.loads("v = '\n'")
+ self.assertTrue(" '\\n' " in str(exc_info.exception))
+
+ def test_module_name(self):
+ self.assertEqual(tomllib.TOMLDecodeError().__module__, tomllib.__name__)
+
+ def test_invalid_parse_float(self):
+ def dict_returner(s: str) -> dict:
+ return {}
+
+ def list_returner(s: str) -> list:
+ return []
+
+ for invalid_parse_float in (dict_returner, list_returner):
+ with self.assertRaises(ValueError) as exc_info:
+ tomllib.loads("f=0.1", parse_float=invalid_parse_float)
+ self.assertEqual(
+ str(exc_info.exception), "parse_float must not return dicts or lists"
+ )
diff --git a/tests/test_misc.py b/tests/test_misc.py
new file mode 100644
index 0000000..76fa590
--- /dev/null
+++ b/tests/test_misc.py
@@ -0,0 +1,101 @@
+# SPDX-License-Identifier: MIT
+# SPDX-FileCopyrightText: 2021 Taneli Hukkinen
+# Licensed to PSF under a Contributor Agreement.
+
+import copy
+import datetime
+from decimal import Decimal as D
+from pathlib import Path
+import tempfile
+import unittest
+
+from . import tomllib
+
+
+class TestMiscellaneous(unittest.TestCase):
+ def test_load(self):
+ content = "one=1 \n two='two' \n arr=[]"
+ expected = {"one": 1, "two": "two", "arr": []}
+ with tempfile.TemporaryDirectory() as tmp_dir_path:
+ file_path = Path(tmp_dir_path) / "test.toml"
+ file_path.write_text(content)
+
+ with open(file_path, "rb") as bin_f:
+ actual = tomllib.load(bin_f)
+ self.assertEqual(actual, expected)
+
+ def test_incorrect_load(self):
+ content = "one=1"
+ with tempfile.TemporaryDirectory() as tmp_dir_path:
+ file_path = Path(tmp_dir_path) / "test.toml"
+ file_path.write_text(content)
+
+ with open(file_path, "r") as txt_f:
+ with self.assertRaises(TypeError):
+ tomllib.load(txt_f) # type: ignore[arg-type]
+
+ def test_parse_float(self):
+ doc = """
+ val=0.1
+ biggest1=inf
+ biggest2=+inf
+ smallest=-inf
+ notnum1=nan
+ notnum2=-nan
+ notnum3=+nan
+ """
+ obj = tomllib.loads(doc, parse_float=D)
+ expected = {
+ "val": D("0.1"),
+ "biggest1": D("inf"),
+ "biggest2": D("inf"),
+ "smallest": D("-inf"),
+ "notnum1": D("nan"),
+ "notnum2": D("-nan"),
+ "notnum3": D("nan"),
+ }
+ for k, expected_val in expected.items():
+ actual_val = obj[k]
+ self.assertIsInstance(actual_val, D)
+ if actual_val.is_nan():
+ self.assertTrue(expected_val.is_nan())
+ else:
+ self.assertEqual(actual_val, expected_val)
+
+ def test_deepcopy(self):
+ doc = """
+ [bliibaa.diibaa]
+ offsettime=[1979-05-27T00:32:00.999999-07:00]
+ """
+ obj = tomllib.loads(doc)
+ obj_copy = copy.deepcopy(obj)
+ self.assertEqual(obj_copy, obj)
+ expected_obj = {
+ "bliibaa": {
+ "diibaa": {
+ "offsettime": [
+ datetime.datetime(
+ 1979,
+ 5,
+ 27,
+ 0,
+ 32,
+ 0,
+ 999999,
+ tzinfo=datetime.timezone(datetime.timedelta(hours=-7)),
+ )
+ ]
+ }
+ }
+ }
+ self.assertEqual(obj_copy, expected_obj)
+
+ def test_inline_array_recursion_limit(self):
+ nest_count = 470
+ recursive_array_toml = "arr = " + nest_count * "[" + nest_count * "]"
+ tomllib.loads(recursive_array_toml)
+
+ def test_inline_table_recursion_limit(self):
+ nest_count = 310
+ recursive_table_toml = nest_count * "key = {" + nest_count * "}"
+ tomllib.loads(recursive_table_toml)